# Vinted Sellers Database — Brands, Sold Prices, Pro Shops (`moxlade/vinted-users`) Actor

Every Vinted seller in the FR/IT/ES/NL/BE/PT/LU zone, ranked — who carries your brands and how far under the market median they price, what each closet holds and sold, Pro shops with their trade-register facts. Answered from a census of 3.1M listings: instant rows, no login, no proxy, no start fee.

- **URL**: https://apify.com/moxlade/vinted-users.md
- **Developed by:** [Moxlade](https://apify.com/moxlade) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 member row (from the census)s

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Vinted Sellers Database — Brands, Sold Prices, Pro Shops

**Who on Vinted sells the brands you buy, how far under the market they price, and what their closet actually holds — from a census of 3.09 million listings, 12.3 million reviews and 15,215 closets, not a live page fetch.** Every other Vinted tool fetches a search page and forgets it. This one remembers the market: it knows what a brand *sold* for across the whole corpus, so a seller's asking price arrives as a ratio (`0.62` = 38% under the sold median), a listing arrives with a `deal_score`, and a sold listing stays after Vinted stops showing it. Ranked sellers by country, the closets most like one you already buy from, Pro shops with their trade-register facts. No Vinted login, no proxy, no start fee — pay per delivered row.

### Who sells these brands under the market

Give it this:

```json
{
  "brands": [
    "Sézane",
    "Isabel Marant",
    "Acne Studios"
  ],
  "maxPriceRatio": 0.8,
  "minBrandItems": 2,
  "minFollowers": 300,
  "sortBy": "ratio",
  "includeItems": true,
  "maxItems": 100
}
```

Back comes one row per seller (`kind` says how it was reached) — the fields below are the ones this real row carried; every row has the same 74, and a field the source did not show arrives as null, not as a zero:

```json
{
  "id": 5601010,
  "login": "guliette",
  "profile_url": "https://www.vinted.com/member/5601010-guliette",
  "country_code": "FR",
  "city": "Le Touquet-Paris-Plage",
  "is_business": false,
  "followers_count": 6129,
  "following_count": 137,
  "feedback_count": 2991,
  "feedback_reputation": 1,
  "positive_feedback_count": 2955,
  "neutral_feedback_count": 8,
  "negative_feedback_count": 28,
  "item_count": 131,
  "given_item_count": 3518,
  "taken_item_count": 280,
  "is_on_holiday": false,
  "last_logged_on": "2026-09-20T09:58:56Z",
  "account_gone": false,
  "photo_url": "https://images1.vinted.net/t/02_02268_uf81TU1vBFyHzkn1xABxDbGY/f800/1605231905.jpeg?s=fff81cffc4a19fc4c2df2f448e5999d7a8 …",
  "has_profile": true,
  "counts_at": "2026-09-20T10:15:04Z",
  "profile_at": "2026-09-20T10:15:04Z",
  "first_seen_at": "2026-09-18T18:39:32Z",
  "source": "stored",
  "items_open": 131,
  "items_sold_seen": 0,
  "top_brand": "Tartine et Chocolat",
  "price_open_median": 15,
  "sales_30d": 0,
  "currency": "EUR",
  "summary_at": "2026-09-21T01:49:39Z",
  "summary": "A high-volume reseller with 131 listings open (131 on record, 0 seen sold). Mostly children's clothes. Sized for childre …",
  "summary_source": "template",
  "categories": [{"name": "kids", "share": 0.481}, {"name": "shoes", "share": 0.099}, {"name": "women_clothing", "share": 0.092}, {"name": "home", "share": 0.061}, "… 8 more"],
  "category_top": "kids",
  "section": "kids",
  "archetype": "power_reseller",
  "price_index": 0.71,
  "brand_items_open": 3,
  "brand_items_sold": 0,
  "brand_items_gone": 0,
  "brand_median_open": 10,
  "brand_ratio_open": 0.167,
  "brand_ratio_sold": 0.222,
  "brand_fav_per_item": 27.67,
  "brand_last_listed_at": "2026-09-17T10:24:40Z",
  "brand_keys": {"sezane": [3, 0]},
  "garments": [{"name": "set", "share": 0.076}, {"name": "sweater", "share": 0.061}, {"name": "sneakers", "share": 0.061}, {"name": "pyjama", "share": 0.053}, "… 8 more"],
  "materials": [{"name": "denim", "share": 0.046}, {"name": "synthetic", "share": 0.008}, {"name": "wool", "share": 0.008}],
  "colours": [{"name": "brown", "share": 0.183}, {"name": "gold", "share": 0.015}, {"name": "orange", "share": 0.008}, {"name": "khaki", "share": 0.008}, "… 1 more"],
  "signals": [{"name": "lot", "share": 0.076}, {"name": "lookalike", "share": 0.008}],
  "tags_coverage": {"era": 0, "colour": 0.221, "signal": 0.084, "garment": 0.603, "material": 0.061},
  "flags": ["power", "active", "dealer"],
  "kind": "user",
  "rank": 1,
  "found_by": "sourcing:ratio",
  "fetched_at": "2026-09-23T14:44:34Z",
  "items": [
    {
      "item_id": 10031573128,
      "title": "Maxi Totebag Sézane",
      "brand": "Sézane",
      "brand_key": "sezane",
      "size": null,
      "condition": "very_good",
      "price": 15,
      "currency": "EUR",
      "total_price": 16.45,
      "favourites": 63,
      "views": 0,
      "state": "open",
      "closing_action": null,
      "sold_price": null,
      "promoted": false,
      "photo_url": "https://images1.vinted.net/t/06_020cc_ZHo68dwEnjAnoiY9XS3s65V5/f800/1789640680.jpeg?s=d3b80968cbf7e3c85c35fec7ac1cc934a3d7528d",
      "url": "https://www.vinted.fr/items/10031573128-maxi-totebag-sezane",
      "listed_at": "2026-09-17T10:24:40Z",
      "days_listed": 3,
      "ratio_open": 0.25,
      "ratio_sold": 0.333,
      "heat": 21,
      "price_drop_pct": null,
      "deal_score": 70,
      "category": null,
      "section": null,
      "garment": null,
      "material": null,
      "era": null,
      "colours": [],
      "signals": [],
      "first_seen_at": "2026-09-19T14:37:20Z",
      "closed_seen_at": null,
      "gone_at": null
    },
    "… 2 more"
  ]
}
```

The same actor, asked differently:

- **Vinted Pro accounts by followers** — `{"businessOnly": true, "country": "FR", "sortBy": "followers", "maxItems": 500}`
- **Closets like the ones you already buy from** — `{"similarTo": ["113765333"], "minFollowers": 300, "maxFollowers": 20000, "maxItems": 100}`
- **Vintage-heavy closets, trade sellers only** — `{"closetShares": ["era:vintage:0.3"], "flags": ["dealer"], "country": "FR", "sortBy": "items_open", "maxItems": 200}`
- **Who sells a brand** — `{"hasBrand": "Acne Studios", "minBrandItems": 2, "sortBy": "brand_items", "maxItems": 200}`
- **Fastest-selling closets** — `{"sortBy": "sales_30d", "minOpenItems": 10, "maxItems": 200}`
- **Most-followed members in a country** — `{"country": "FR", "sortBy": "followers", "maxItems": 1000}`
- **A member's full record by id** — `{"userIds": ["15028320"]}`
- **Full records by profile URL, as of now** — `{"profileUrls": ["https://www.vinted.fr/member/15028320-nina"], "fresh": true}`
- **Followers of an account** — `{"followersOf": ["15028320"], "maxPerUser": 500, "maxItems": 500}`
- **What the most-followed sellers in a country sell** — `{"country": "FR", "sortBy": "followers", "minOpenItems": 1, "includeItems": true, "itemsState": "open", "maxItemsPerMember": 50, "maxItems": 100}`

### What a row carries

**Who carries the brands you buy, and how far under the market.** `brands: ["Sézane", "Isabel Marant"]` with `maxPriceRatio: 0.7` returns the sellers whose asking median for those brands sits 30% or more under what the census has seen those brands *sell* for — spellings, diffusion lines and collaborations follow the house (ask for Sézane, get Petit Sezane too). Every row carries `brand_items_open`, `brand_items_sold`, `brand_median_open`, `brand_ratio_sold`, `brand_ratio_open`, `brand_fav_per_item`, `brand_last_listed_at` and the per-key counts. `sortBy: ratio` puts the cheapest first; `minFollowers` / `maxFollowers` pick the band.

**The arbitrage number, not a guess.** The yardstick is the census's own medians per brand — asking median over at least 10 open listings, sold median over at least 5 observed sales — so `brand_ratio_sold: 0.44` means the seller asks 44% of what that brand actually sold for. With `includeItems` every listing of those brands comes with `ratio_sold`, `ratio_open`, `days_listed` (from the upload instant Vinted writes into the photo URL), `heat` (favourites per day), `price_drop_pct` and a `deal_score` that ranks them. No other Vinted source can compute a market median: it needs the whole corpus, not a search page.

**What a closet actually holds.** Every listing is tagged from its title in seven languages — `garment` (dress, jacket, sneakers, boots…), `material` (leather, wool, silk, denim, lace…), `era` (60s…2000s, y2k, vintage, retro, archive), `colours`, and `signals` (new, tags, worn once, lot, retail reference, authentic, receipt, box, rare, limited, handmade, negotiable, social, lookalike, sample). Per seller these come back as shares — `garments`, `materials`, `eras`, `colours`, `signals` — each next to `tags_coverage` so you read a share against how many titles said anything at all. `closetShares` filters on them: `garment:dress:0.4`, `era:vintage:0.3`, `signal:lot:0.1`.

**More closets like the one you already buy from.** `similarTo` takes sellers (ids, URLs or usernames — one, or the whole list an account follows) and returns the closets most like them: half the fingerprint above, half the brand overlap, every coordinate weighted by how rare it is, so a shared Zara counts for little and a shared Anine Bing counts for a lot. Each row carries `similarity`, `tags_similarity`, `brand_overlap` and `shared_brands`, so the match is auditable.

**Pick the kind of seller.** `flags` requires all of what you pick: `dealer` (a business, a volume seller, trade wording in the titles, or 200+ listings open), `creator` (followed for the person — 2,000+ followers with sales under a twentieth of them, or the titles cite social media), `gifted` (PR packages and samples in the titles), plus `vintage`, `luxury`, `kids`, `power`, `pro`, `celebrity`, `active`. Read with `archetype` and `traits`, which say which rule fired.

**Vinted Pro accounts, biggest first — with the company behind each shop.** `businessOnly` with a `country` returns the registered business sellers of that market ranked by followers, reviews, sales or closet size — and the trade-register facts Vinted shows on the shop's legal notice: `legal_name`, `legal_code` (SIRET, KvK, …), `vat_number`, `entity_type`, `entity_country`, `entity_verified`. The list no marketplace page gives you.

**Sold listings kept.** Vinted shows a sold listing in a closet for a few months and then drops it; the census keeps every listing it has seen sold with its last price and the date, so a seller's sales history grows past what the profile page shows. `includeItems` attaches the closet with each listing's `state`: open, sold, or gone.

**A follower ranking Vinted does not publish.** Give it a country and `maxItems` and back come the most-followed sellers in order, with `rank`, follower count, reviews, positive share and country on every row, from a census that walked the follow graph rather than guessing usernames. Or rank by `sold_price`, `items_open`, `sales_30d`.

**Any member's full record.** `userIds`, `profileUrls` or `logins` return the member: followers and following, reviews split into positive, neutral and negative, items listed now, items sold and bought all time, holiday mode, last login, Vinted Pro flag, photo. Turn on `fresh` and every one is re-read from Vinted during the run. `followersOf` / `followingOf` list an account's followers or follows, 90 per request, each row carrying that account's own counts.

**Counts with dates, gone accounts kept.** `counts_at` says when the follower and review counts were read, `profile_at` when the full record was, `summary_at` when the closet was summarised; a member Vinted no longer serves arrives with `account_gone: true` and the last known numbers, never silently dropped.

**Nothing to configure, nothing private.** No cookies, no account, no proxy field — Vinted is read anonymously through exits we maintain, paced under its own limiter, and every row says whether it came from the census (`stored`) or from Vinted during the run (`live`). The record never carries a member's about-text, birthday, real name, e-mail, address or social ids: those are dropped before anything is stored, and a member who asks is removed from every answer.

### All 74 fields of a row

Every row carries all of them. A field the source did not show arrives as null, never as a zero or an empty string, and the note says when that happens.

#### The member

| field | type | what it holds |
|---|---|---|
| `id` | integer | Vinted's member id. Stable; the key for deduplication and for `userIds` on a later run. |
| `login` | string | The member's username as shown on their profile. |
| `profile_url` | string | The profile page. Vinted serves the same member on every country domain. |
| `country_code` | string | ISO country of the account (`FR`, `DE`, `IT`, `ES`, `UK`, …). |
| `city` | string | City as the member entered it, when they did. Full-record rows only. |
| `is_business` | boolean | A Vinted Pro (business) account. |
| `photo_url` | string | Profile photo, full size. |
| `account_gone` | boolean | True when Vinted no longer serves this member (deleted or banned) — the last known counts are kept. |
| `has_profile` | boolean | True when the full record (sales, purchases, listings, last login) has been read for this member; false when only the counter fields are known. |
| `first_seen_at` | string | When this member first entered the census, ISO 8601 UTC. Null on rows read live that were never stored. |

#### Followers, reviews, activity

| field | type | what it holds |
|---|---|---|
| `followers_count` | integer | Followers as Vinted counted them when this row was read (`counts_at`). |
| `following_count` | integer | Accounts the member follows. Full-record rows only. |
| `feedback_count` | integer | Reviews received, all ratings. |
| `feedback_reputation` | number | Share of positive reviews, 0–1 (0.98 = 98% positive). |
| `positive_feedback_count` | integer | Positive reviews. Full-record rows only. |
| `neutral_feedback_count` | integer | Neutral reviews. Full-record rows only. |
| `negative_feedback_count` | integer | Negative reviews. Full-record rows only. |
| `last_logged_on` | string | Last login, ISO 8601 UTC. Full-record rows only. |
| `is_on_holiday` | boolean | Holiday mode on (listings hidden). Full-record rows only. |
| `counts_at` | string | When `followers_count`, `feedback_count` and `feedback_reputation` were last read from Vinted, ISO 8601 UTC. |
| `profile_at` | string | When the full record was last read, ISO 8601 UTC. Null without one. |

#### Listed, sold, bought

| field | type | what it holds |
|---|---|---|
| `item_count` | integer | Items listed for sale right now. Full-record rows only. |
| `given_item_count` | integer | Items sold, all time. Full-record rows only. |
| `taken_item_count` | integer | Items bought, all time. Full-record rows only. |
| `items_open` | integer | Listings for sale now, as the census last read the closet. Null until the closet has been read. |
| `items_sold_seen` | integer | Listings the census has seen sold — marked sold in the closet, or gone from it while the member's sold count rose. |
| `sales_30d` | integer | Listings the census watched go from open to sold or gone in the last 30 days — observed sales, so 0 until a closet has been read at least twice; the reviews ledger is the other 30-day signal. |

#### Prices, and where the closet sits in the market

| field | type | what it holds |
|---|---|---|
| `price_open_median` | number | Median asking price of the open listings, in `currency`. |
| `price_sold_median` | number | Median last listed price of the listings seen sold. |
| `currency` | string | Currency of the prices (`EUR`, `GBP`, `PLN`, …). |
| `price_index` | number | The member's asking prices against the census median for the same brands, weighted by listing count: 1.0 = in line, 0.8 = 20% under, 1.3 = 30% over. Null when no brand has three listings and a census yardstick. |
| `top_brand` | string | The most listed brand in the closet. |

#### The brand block

Filled on runs that name a brand — `brands` (one or many, sourcing) or `hasBrand`. Null on every other run.

| field | type | what it holds |
|---|---|---|
| `brand_items_open` | integer | With `hasBrand`: the member's listings of that brand for sale now. Null on runs without `hasBrand`. |
| `brand_items_sold` | integer | With `hasBrand`: the member's listings of that brand the census has seen sold. Null on runs without `hasBrand`. |
| `brand_items_gone` | integer | With `brands`: listings of those brands that left the closet between two reads (sold or withdrawn). Null otherwise. |
| `brand_median_open` | number | With `brands`: the member's median asking price for those brands, open listings. Null otherwise. |
| `brand_ratio_open` | number | With `brands`: the member's asking median for the brand over the census asking median (brands with >= 10 open listings). 0.7 = 30% under what others ask. Null otherwise. |
| `brand_ratio_sold` | number | With `brands`: the member's asking median for the brand over the census SOLD median (>= 5 sales seen) — the yardstick that matters to a buyer. Null when the brand has too few sales seen. |
| `brand_fav_per_item` | number | With `brands`: favourites per open listing of those brands — demand at the seller's prices. |
| `brand_last_listed_at` | string | With `brands`: when the member last listed one of those brands (from the photo upload instant). |
| `brand_last_sold_at` | string | With `brands`: when the census last saw one of those brands sold from this closet. |
| `brand_keys` | object | With `brands`: per brand key, `[open, sold]` counts — which of the asked brands the member actually carries. |

#### What the closet holds

Read from the listing titles in seven languages and from the aggregate numbers. Every share is a share of the whole closet, so read it against `tags_coverage`, never against the other shares.

| field | type | what it holds |
|---|---|---|
| `summary` | string | One paragraph on what the member sells — categories, brands, prices, condition, activity. Written from the numbers and the listing titles; `summary_source` says by which method. Null until the closet has been read. |
| `summary_source` | string | `template` — composed from the structured fields; `llm` — written by the language model from the titles. Null without a summary. |
| `summary_at` | string | When the closet summary was last computed, ISO 8601 UTC. |
| `categories` | array | What the closet holds, as shares: `[{name, share}]` over a fixed taxonomy (women\_clothing, men\_clothing, kids, shoes, bags, accessories, jewellery, beauty, home, electronics, books\_media, toys, sports, other). From the title lexicon, or from the language model when it has run. |
| `category_top` | string | The largest category share. |
| `section` | string | Who the closet is for: `women`, `men`, `kids`, or `mixed` — from Vinted's size formats and the titles. |
| `archetype` | string | One label from the numbers: `vintage_dealer`, `kids_seller`, `luxury_reseller`, `power_reseller`, `pro_seller`, `celebrity_closet`, `active_seller`, `light_seller`. |
| `garments` | array | Item types across the closet, `[{name, share}]` by share of ALL listings (dress, jacket, sneakers, boots, sweater, …); the shares of one dimension sum to its coverage, never to 1. Null until the closet was read. |
| `materials` | array | Materials named in the titles, `[{name, share}]` (leather, wool, silk, denim, cashmere, lace, knit, …). |
| `eras` | array | Decade and vintage words in the titles, `[{name, share}]`: 60s|70s|80s|90s|2000s|y2k|vintage|retro|archive. |
| `colours` | array | Colour words in the titles, `[{name, share}]` (black, white, beige, navy, pink, …); a listing can name several. |
| `signals` | array | Seller-wording signals in the titles, `[{name, share}]`: new, tags, worn\_once, lot, ref (retail reference codes), authentic, receipt, box, rare, limited, handmade, negotiable, social, lookalike, sample. A high `lot` + `ref` share reads as trade stock; `worn_once` + `receipt` as a private closet. |
| `tags_coverage` | object | Share of the closet's listings that carry a value per dimension, `{garment, material, era, colour, signal}` — read every share against it. |
| `flags` | array | The traits that fired, from the numbers and the title signals: `vintage`, `kids`, `luxury`, `power`, `pro`, `celebrity`, `active`, `creator` (followed for the person: 2,000+ followers with fewer sales than a twentieth of them, or the titles cite social media), `gifted` (PR packages and samples in the titles), `dealer` (a business or volume seller, trade wording, or 200+ open listings). Null until the closet was read. |

#### How like the closets you asked for

Filled on `similarTo` runs only.

| field | type | what it holds |
|---|---|---|
| `similarity` | number | `similarTo` runs only: how like the asked closets this one is, 0-1 — half the tag fingerprint, half the brand overlap, every coordinate weighted by how rare it is across the census (a shared Zara counts for little, a shared Anine Bing for a lot). Null on every other run. |
| `tags_similarity` | number | `similarTo` runs only: the fingerprint half on its own — garment, material, era, colour and wording shares plus the archetype and flags. |
| `brand_overlap` | number | `similarTo` runs only: the brand half on its own — how much of the asked closets' brand mix this closet also carries, weighted by brand rarity. |
| `shared_brands` | array | `similarTo` runs only: the brands behind `brand_overlap`, rarest-first — the reason this closet matched. |

#### Vinted Pro: the company behind the shop

From the shop's own legal notice on Vinted. Null for private members, and for a Pro shop that publishes no notice.

| field | type | what it holds |
|---|---|---|
| `legal_name` | string | Vinted Pro rows: the registered name behind the shop as Vinted shows it on the shop's legal notice — the company for a legal business or organisation, the trader's registered name for a sole trader. Null for private members. |
| `legal_code` | string | Vinted Pro rows: the company's registration number (SIRET in France, KvK in the Netherlands, …). |
| `vat_number` | string | Vinted Pro rows: the company's VAT id, when registered. |
| `entity_type` | string | Vinted Pro rows: `legal_business`, `sole_trader`, `organization`, … as Vinted classifies the entity. |
| `entity_country` | string | Vinted Pro rows: ISO country of the company's registration. |
| `entity_verified` | boolean | Vinted Pro rows: Vinted verified the company's identity. |

#### The listings and the history

| field | type | what it holds |
|---|---|---|
| `items` | array | With `includeItems`: the member's listings as the census holds them — `[{item_id, title, brand, brand_key, size, condition, price, currency, total_price, favourites, views, state (open\|sold\|gone), closing_action, sold_price, promoted, photo_url, url, listed_at, days_listed, ratio_open, ratio_sold, heat, price_drop_pct, deal_score, category, section, garment, material, era, colours, signals, first_seen_at, closed_seen_at, gone_at}]`. On a `brands` run only the listings of those brands. `ratio_sold` = price / the brand's census sold median; `deal_score` sorts a brand's open listings (higher = better); `garment`…`signals` are the per-listing tags from the title lexicon. Billed `item` per element. |
| `history` | array | With `includeHistory`: every version of the member's record — `[{seq, fetched_at, changed: {field: [old, new]}}]` — and the count observations, newest first. |

#### How the row was reached

The same fields on every row, so a mixed run stays auditable: what kind of row it is, where it came from, and when.

| field | type | what it holds |
|---|---|---|
| `kind` | string | `user` for a ranked member, `profile` for a member read by id/URL/login, `follower` or `following` for a list row. |
| `rank` | integer | Position in the ranking for `user` rows (1 = most), or in the list for list rows. Null on `profile` rows. |
| `of_user_id` | integer | List rows: the member whose followers or followed accounts this row belongs to. |
| `found_by` | string | How the row was reached: `ranking:<sort>[:<country>]`, `id:<id>`, `login:<login>`, `url`, `followers_of:<id>`, `following_of:<id>`. |
| `source` | string | `stored` — answered from the census; `live` — read from Vinted during this run. |
| `fetched_at` | string | When this row was produced, ISO 8601 UTC. |

### Ways to run it

**Source a brand under the market.** Set `brands` (one or many, as Vinted spells them), `maxPriceRatio` (0.7 = 30% under the census sold median), the follower band with `minFollowers` / `maxFollowers`, a `country` if the seller must be in one, `sortBy: ratio`, and `includeItems` to get the listings of those brands with a `deal_score` on each. Rows are sellers with the brand block. Ready-made: [Who sells these brands under the market](https://apify.com/moxlade/vinted-users/examples/brands-under-the-market).

**Find closets like the ones you already buy from.** Put the sellers in `similarTo` — ids, profile URLs or usernames, one or hundreds (the whole list an account follows works). Back come the closets most like them, with `similarity`, `tags_similarity`, `brand_overlap` and `shared_brands` on every row. Narrow with `minFollowers` / `maxFollowers`, `country`, `flags` or `closetShares`; the targets themselves are never returned. Ready-made: [Closets like the ones you already buy from](https://apify.com/moxlade/vinted-users/examples/closets-like-the-ones-you-buy-from).

**Filter by what the closet holds.** `closetShares` takes `dimension:value:min` — `garment:dress:0.4` (at least 40% dresses), `era:vintage:0.3`, `material:leather:0.2`, `signal:lot:0.1` (trade wording) — and several are combined with AND. `flags` requires all of what you pick: `dealer`, `creator`, `gifted`, `vintage`, `luxury`, `kids`, `power`, `pro`, `celebrity`, `active`. Both work on their own, with `brands`, or with `similarTo`. Ready-made: [Vintage-heavy closets, trade sellers only](https://apify.com/moxlade/vinted-users/examples/vintage-heavy-trade-closets).

**Find who carries a brand.** Set `hasBrand` to the brand as Vinted spells it (case does not matter), `minBrandItems` to skip one-off listings, `sortBy: brand_items` to rank by how many they hold; add `businessOnly: false` to keep private closets only. Each row carries `brand_items_open` and `brand_items_sold`. Ready-made: [Who sells a brand](https://apify.com/moxlade/vinted-users/examples/who-sells-a-brand).

**See what a seller sells.** Add `includeItems` to any run: each row gets `items` — up to `maxItemsPerMember` listings, `itemsState` open / sold / gone / all — and the summary fields fill in for every seller whose closet has been read. Ready-made: [What the most-followed sellers in a country sell](https://apify.com/moxlade/vinted-users/examples/what-the-most-followed-sellers-sell).

**List the Pro sellers of a market.** Set `businessOnly`, a `country`, `sortBy` (`followers`, `feedback`, `items_open`, `sales_30d`) and `maxItems`. Rows come ranked from 1, up to 10,000 per run. Ready-made: [Vinted Pro accounts by followers](https://apify.com/moxlade/vinted-users/examples/vinted-pro-accounts-by-followers).

**Rank sellers by followers, sales or closet.** Leave the member and list fields empty, set `country` (or none for every country), `sortBy`, `minFollowers` and `maxItems`. Ready-made: [Most-followed members in a country](https://apify.com/moxlade/vinted-users/examples/most-followed-members-in-a-country) and [Fastest-selling closets](https://apify.com/moxlade/vinted-users/examples/fastest-selling-closets).

**Read members by id, URL or username.** Put ids in `userIds`, profile links in `profileUrls`, usernames in `logins` — mix them freely. A member the census holds answers at once as a `user` row; one it has never seen is read from Vinted now and returned as a `profile` row (up to 50 live reads per 50 members). `fresh` re-reads every member from Vinted in this run. Ready-made: [Full records by profile URL](https://apify.com/moxlade/vinted-users/examples/full-records-by-profile-url).

**List an account's followers or the accounts it follows.** Set `followersOf` or `followingOf` (ids, usernames or URLs) and `maxPerUser`. Lists are read 90 rows at a time in Vinted's own order and every row carries the listed account's follower count, reviews and country. Ready-made: [Followers of an account](https://apify.com/moxlade/vinted-users/examples/followers-of-an-account).

**Watch it move.** Save a ranking run as a task and schedule it: each run is the census as of that day, `counts_at` on every row. For exact as-of-now numbers on a fixed set of members, schedule a `userIds` run with `fresh` on.

### Everything you can ask for

#### Pick the sellers

Leave the member fields below empty and these rank the census: who comes back, in what order, how many.

| input | accepts | default | what it changes |
|---|---|---|---|
| `country` | `string` | — | Ranking mode: two-letter ISO country of the seller's account. The census covers the FR/IT/ES/NL/BE/PT/LU shipping zone today (FR, IT, ES, NL, BE, PT, LU). Empty = every country. |
| `sortBy` | `followers` / `feedback` / `sold` / `following` / `sold_price` / `items_open` / `sales_30d` / `brand_items` / `ratio` | `"followers"` | Ranking mode: the order of the `user` rows. `sold` and `following` rank members whose full record has been read; `sold_price`, `items_open` and `sales_30d` rank members whose closet has been read; `brand_items` ranks the members who carry `hasBrand` by how many listings of it they have. `ratio` orders a `brands` run by `brand_ratio_sold`, cheapest first. |
| `minFollowers` | `integer` | `0` | Ranking mode: skip members below this many followers. |
| `maxFollowers` | `integer` | — | Ranking and sourcing modes: skip members above this many followers — the band where the small creators live (e.g. 300–50,000). |
| `minOpenItems` | `integer` | — | Ranking mode: skip members with fewer listings for sale right now (needs the closet to have been read). |
| `businessOnly` | `boolean` | `false` | Ranking mode: keep only business (Vinted Pro) accounts. |
| `archetype` | `""` / `vintage_dealer` / `kids_seller` / `luxury_reseller` / `power_reseller` / `pro_seller` / `celebrity_closet` / `active_seller` / `light_seller` | `""` | Ranking mode: keep members of one type, as the census labels them from the numbers (needs the closet to have been read). |
| `section` | `""` / `women` / `men` / `kids` / `mixed` | `""` | Ranking mode: keep closets whose listings are mostly for women, men or children. |
| `category` | `""` / `women_clothing` / `men_clothing` / `kids` / `shoes` / `bags` / `accessories` / `jewellery` / `beauty` / `home` / `electronics` / `books_media` / `toys` / `sports` / `other` | `""` | Ranking mode: keep members whose closet summary puts at least a quarter of the listings in this category. |

#### Brands, and the price against the market

The reselling and arbitrage half: who carries a brand, and how their asking median compares with what the census has seen that brand sell for.

| input | accepts | default | what it changes |
|---|---|---|---|
| `brands` | `array` | — | Sourcing mode: who carries any of these brands — open or seen sold — with the brand block on every row: `brand_items_open`, `brand_items_sold`, `brand_median_open` (the seller's asking median for them), `brand_ratio_sold` (that median over the census SOLD median: 0.7 = 30% under what the brand fetches), `brand_ratio_open`, `brand_fav_per_item`, `brand_last_listed_at`, `brand_keys`. Names as written on Vinted; spellings, lines and collaborations follow (`Sézane` also finds Petit Sezane). Combine with `maxPriceRatio`, `minBrandItems`, `minFollowers`/`maxFollowers`, `country`; `sortBy` = `ratio` (cheapest first), `brand_items` or `followers`. With `includeItems`, the `items` array holds only the listings of these brands, each with `ratio_sold` and `deal_score`. |
| `maxPriceRatio` | `number` | — | With `brands`: keep sellers whose asking median for the brands is at most this many times the census SOLD median — 0.7 keeps sellers 30% or more under what the brands actually fetch. Sellers of brands with fewer than 5 sales seen have no ratio and are left out. |
| `hasBrand` | `string` | — | Ranking mode: keep sellers whose closet holds this brand — open now or seen sold — however small a share of their closet it is (case-insensitive, e.g. Acne Studios). Adds `brand_items_open` and `brand_items_sold` to each row. `brand` is the other filter: the seller's single most-listed brand. |
| `brand` | `string` | — | Ranking mode: keep members whose most listed brand is this one (case-insensitive, e.g. Zara). |
| `minBrandItems` | `integer` | `1` | With `hasBrand`: skip sellers with fewer listings of the brand (open + seen sold). |

#### What the closet holds, and who the seller is

Filters over the tags read from every listing title and the traits computed from the numbers, plus lookalike search.

| input | accepts | default | what it changes |
|---|---|---|---|
| `closetShares` | `array` | — | Share floors on what the closet holds, as `dimension:value:min` — `garment:dress:0.4` (at least 40% dresses), `era:vintage:0.3`, `material:leather:0.2`, `colour:black:0.3`, `signal:lot:0.1` (trade wording), `category:kids:0.5`. Several are combined with AND. Read them against `tags_coverage` on the row: shares are over the whole closet, so a dimension the titles rarely name has a low ceiling. |
| `flags` | `array` | — | Every flag you pick must be present. `creator` — followed for the person (2,000+ followers with sales under a twentieth of them, or the titles cite social media). `dealer` — a business, a volume seller, trade wording (lots, retail reference codes), or 200+ listings open. `gifted` — PR packages and samples in the titles. `vintage`, `luxury`, `kids`, `power`, `pro`, `celebrity`, `active` — the closet's own shape. |
| `similarTo` | `array` | — | Sellers whose closet you want matched — ids, profile URLs or usernames. Back come the members whose closets are most like theirs: half the fingerprint (what they sell, in what material, which era, which colours, which wording), half the brand overlap. Each row carries `similarity`, `tags_similarity`, `brand_overlap` and `shared_brands`. The targets themselves are never returned. |

#### Read members you name

Give ids, profile links or usernames and the run answers for those members instead of ranking the census.

| input | accepts | default | what it changes |
|---|---|---|---|
| `userIds` | `array` | — | Members to read by Vinted id (the number in a profile URL, e.g. 15028320). Stored members answer from the census; others are read from Vinted now. Billed `user` for stored rows, `profile` for live ones. |
| `profileUrls` | `array` | — | Members to read by profile URL (https://www.vinted.fr/member/15028320-nina). Any Vinted country domain. |
| `logins` | `array` | — | Members to read by username (exact match, case-insensitive). Resolving a username Vinted knows but the census does not costs one live request. |
| `followersOf` | `array` | — | Members whose followers to list — ids, usernames or profile URLs. One `follower` row per follower, with the follower's own follower count, reviews and country, up to `maxPerUser` each. |
| `followingOf` | `array` | — | Members whose followed accounts to list — ids, usernames or profile URLs. One `following` row per followed account, up to `maxPerUser` each. |
| `maxPerUser` | `integer` | `1000` | Lists mode: stop each followers / following list after this many rows (read 90 at a time). |
| `fresh` | `boolean` | `false` | Members mode: read every requested member from Vinted during this run, even when the census holds them, so counts are as of now. Every row is then billed `profile`. |

#### Attach the listings and the history

Optional blocks on each row. Listings are charged per listing delivered; the history is not.

| input | accepts | default | what it changes |
|---|---|---|---|
| `includeItems` | `boolean` | `false` | Attach the member's listings (`items`, up to `maxItemsPerMember`) to every member row — title, brand, size, condition, price, favourites, sold/open/gone state, sold price, photo. Billed `item` per listing. |
| `itemsState` | `all` / `open` / `sold` / `gone` | `"all"` | With `includeItems`: which listings to attach. |
| `maxItemsPerMember` | `integer` | `100` | With `includeItems`: stop each member's list after this many listings. |
| `includeHistory` | `boolean` | `false` | Attach every version of the member's record (which fields changed, when) and the follower/review count observations (`history`). Not billed separately. |

#### Run size

The spending cap: nothing is charged for a row that is not in your dataset.

| input | accepts | default | what it changes |
|---|---|---|---|
| `maxItems` | `integer` | `100` | Stop after this many rows across the whole run. With no start fee this is also your spending cap. |

### Before you run it

**How is this different from the other Vinted scrapers?** They fetch, this remembers. Every Vinted actor on this store — 40 of them when we read the lane on 2026-09-23 — answers by loading a Vinted page while your run is going: a search, a catalogue, a closet. That gives you what Vinted is showing at that second, and nothing to compare it with. This one answers from a census of 3.09M listings, 12.3M reviews and 15,215 closets that has been kept since 2026-09-18, so it can say what a brand actually *sold* for, hand you a seller's asking price as a ratio to that median, rank the sellers of a market, and still show a listing Vinted stopped displaying months ago. The trade-off is the honest one: it does not search the live catalogue, and a number is as fresh as the date the row carries (`counts_at`, `summary_at`, `fetched_at`).

**Which countries does the census cover?** The FR/IT/ES/NL/BE/PT/LU shipping zone: sellers whose account is in France, Italy, Spain, the Netherlands, Belgium, Portugal or Luxembourg. Vinted shows each market only the sellers of its own zone, so the census is walked one zone at a time; other zones are added as they are walked, and the `country` filter tells you which are present. Members by id, URL or username and follower lists work for any market.

**Does it need a Vinted account or a proxy?** No. Vinted is read logged out, through exits we maintain, and nothing is stored on your side. There is no cookie or proxy field because there is nothing for you to supply.

**How complete is the ranking?** The census is built by sampling members' followed lists across Vinted's whole id space; an account with N followers is found in proportion to N, so the top of the ranking is complete and the long tail is a sample. Every count on a ranked row is the number Vinted served on the date in `counts_at`, not an estimate. Members with a full record (`has_profile`) also carry sales, purchases and last login; `sortBy: sold` and `following` rank those only.

**Why are some rows `stored` and others `live`?** `stored` rows come from the census and are billed as `user`; `live` rows were read from Vinted during your run and are billed as `profile` — a member the census had not seen, or any member when `fresh` is on. A list row is always read live and billed as `follower`. When Vinted cannot be reached for a member you asked for, the stored row is returned instead and billed as `user`, and the status message says so.

**Which country domain does a profile URL need?** Any. A member is the same record on every Vinted domain (vinted.fr, .de, .it, .es, .co.uk, .com, …); `profile_url` on a row uses vinted.com. Usernames are matched exactly, case-insensitive.

**Where do the listings and the summary come from?** From the seller's public closet as the census reads it — open listings and the ones Vinted still shows as sold — in passes that start from the most-followed sellers; `summary_at` on the row says when the closet was last summarised, and a seller whose closet has not been read yet has these fields null. The summary paragraph and the categories are written from the listing titles and the aggregate numbers, never from who the person is.

**How is a sale detected?** Three ways, cross-checked: Vinted marks the listing sold in the closet; the listing leaves the closet while the member's all-time sold count rose by the same number; a review lands. A listing seen sold keeps its last listed price as `sold_price` and the date it was first seen sold. Listings that vanished without a matching sale are `gone`, not sold.

**Is this legal, and what about personal data?** Everything here is read from what Vinted serves anyone, logged out: no account, no cookie, nothing behind a login, and the reading is paced under Vinted's own limiter. What is kept is what a marketplace listing is — the shop, its listings and prices, the counts, the reviews — plus, for a Vinted Pro shop, the trade-register facts the shop itself publishes in its legal notice. A member's about-text, birthday, real name, e-mail, address and social ids are dropped before anything is stored: they are not in the census and cannot be returned by any input. What you may do with a public marketplace record depends on your purpose and your jurisdiction, and that part is yours, not ours.

**Can a member be removed from the data?** Yes. A request to the support address removes the member from every answer this actor and the census give, and drops the stored record.

**How do I get the rows out?** They land in the run's dataset: download them as JSON, CSV, Excel or XML from the run page, or read the same rows over the Apify API (the API tab has the call for this Actor). Save a run as a task, schedule it, and point the store's integrations at it — webhooks, Zapier, Make, Slack, Google Drive — or let an agent call the Actor over MCP. Every row carries a stable `id` and `profile_url`, so repeated runs deduplicate against your own table.

**Who makes this, and what else is there?** [Moxlade](https://moxlade.com) — corpora your agent can ask. Its other actors are the [Upwork freelancer census](https://apify.com/moxlade/upwork-freelancers) and the [Reddit scraper](https://apify.com/moxlade/reddit-scraper); its MCP endpoint for Upwork buyer intelligence is [buyer.moxlade.com](https://buyer.moxlade.com).

### What it costs

Charged per row, and only once the row is in your dataset, so `maxItems`, `maxPerUser` and `maxItemsPerMember` together are your spending cap. No start fee, no minimum, and a run that returns nothing costs nothing. A seller the census already holds is a `user` row; a member read from Vinted during your run (`fresh`, or one the census had never seen) is a `profile` row; a followers or following list row is a `follower` row; each listing attached with `includeItems` is an `item`. The closet summary fields on a row (top brand, prices, categories, the paragraph), the brand counts and `includeHistory` cost nothing extra. A worked example: 500 sellers with 50 listings each is 500 x $0.002 + 25,000 x $0.001 = $26.00; the same 500 sellers without their listings is $1.00; 1,000 follower-list rows is $1.00.

| event | what one event is | per 1,000 |
|---|---|---|
| `user` | One member row answered from the census — a ranked member, or a member you asked for that the census already holds. Charged only after the row is in your dataset. | $2.00 |
| `profile` | One member's full record read from Vinted during your run — a member the census had not seen, or any member with `fresh` on. | $6.00 |
| `follower` | One row of a followers or following list (followersOf / followingOf), with that account's own follower count, reviews and country. | $1.00 |
| `item` | One listing attached to a member row (includeItems) — title, brand, size, condition, price, state, sold price, photo. Charged per listing delivered. | $1.00 |

### Who asks this

**Resellers who buy to resell** — the sellers who carry your brands with their asking price as a ratio to what those brands sold for, the listings of those brands scored, and the closets most like the suppliers you already buy from.

**Arbitrage and price-watching** — a market median per brand from 3.09M listings, so a listing arrives as `ratio_sold`, `days_listed`, `heat` and a `deal_score` instead of a price you have to judge alone; re-run it on a schedule and the numbers move with the market.

**Companies that sell to Vinted Pro sellers** — the registered business accounts of a market as a typed list, biggest first — followers, reviews, listings open, sales in 30 days, what they sell, legal name and VAT — to size and rank a prospect list.

**Brand and marketplace teams** — who lists a brand at volume and at what price against the market, the most-followed sellers in a country, and the follower distribution across the top of the marketplace.

**Data pipelines and AI agents** — one call, JSON rows with a stable `id`, `profile_url` and dated counts, no browser and no login to keep alive.

### Questions

support@moxlade.com

*Every figure on this page was measured on our own runs or read from our own tables, on the date given next to it.*

# Actor input Schema

## `country` (type: `string`):

Ranking mode: two-letter ISO country of the seller's account. The census covers the FR/IT/ES/NL/BE/PT/LU shipping zone today (FR, IT, ES, NL, BE, PT, LU). Empty = every country.

## `sortBy` (type: `string`):

Ranking mode: the order of the `user` rows. `sold` and `following` rank members whose full record has been read; `sold_price`, `items_open` and `sales_30d` rank members whose closet has been read; `brand_items` ranks the members who carry `hasBrand` by how many listings of it they have. `ratio` orders a `brands` run by `brand_ratio_sold`, cheapest first.

## `minFollowers` (type: `integer`):

Ranking mode: skip members below this many followers.

## `maxFollowers` (type: `integer`):

Ranking and sourcing modes: skip members above this many followers — the band where the small creators live (e.g. 300–50,000).

## `minOpenItems` (type: `integer`):

Ranking mode: skip members with fewer listings for sale right now (needs the closet to have been read).

## `businessOnly` (type: `boolean`):

Ranking mode: keep only business (Vinted Pro) accounts.

## `archetype` (type: `string`):

Ranking mode: keep members of one type, as the census labels them from the numbers (needs the closet to have been read).

## `section` (type: `string`):

Ranking mode: keep closets whose listings are mostly for women, men or children.

## `category` (type: `string`):

Ranking mode: keep members whose closet summary puts at least a quarter of the listings in this category.

## `brands` (type: `array`):

Sourcing mode: who carries any of these brands — open or seen sold — with the brand block on every row: `brand_items_open`, `brand_items_sold`, `brand_median_open` (the seller's asking median for them), `brand_ratio_sold` (that median over the census SOLD median: 0.7 = 30% under what the brand fetches), `brand_ratio_open`, `brand_fav_per_item`, `brand_last_listed_at`, `brand_keys`. Names as written on Vinted; spellings, lines and collaborations follow (`Sézane` also finds Petit Sezane). Combine with `maxPriceRatio`, `minBrandItems`, `minFollowers`/`maxFollowers`, `country`; `sortBy` = `ratio` (cheapest first), `brand_items` or `followers`. With `includeItems`, the `items` array holds only the listings of these brands, each with `ratio_sold` and `deal_score`.

## `maxPriceRatio` (type: `number`):

With `brands`: keep sellers whose asking median for the brands is at most this many times the census SOLD median — 0.7 keeps sellers 30% or more under what the brands actually fetch. Sellers of brands with fewer than 5 sales seen have no ratio and are left out.

## `hasBrand` (type: `string`):

Ranking mode: keep sellers whose closet holds this brand — open now or seen sold — however small a share of their closet it is (case-insensitive, e.g. Acne Studios). Adds `brand_items_open` and `brand_items_sold` to each row. `brand` is the other filter: the seller's single most-listed brand.

## `brand` (type: `string`):

Ranking mode: keep members whose most listed brand is this one (case-insensitive, e.g. Zara).

## `minBrandItems` (type: `integer`):

With `hasBrand`: skip sellers with fewer listings of the brand (open + seen sold).

## `closetShares` (type: `array`):

Share floors on what the closet holds, as `dimension:value:min` — `garment:dress:0.4` (at least 40% dresses), `era:vintage:0.3`, `material:leather:0.2`, `colour:black:0.3`, `signal:lot:0.1` (trade wording), `category:kids:0.5`. Several are combined with AND. Read them against `tags_coverage` on the row: shares are over the whole closet, so a dimension the titles rarely name has a low ceiling.

## `flags` (type: `array`):

Every flag you pick must be present. `creator` — followed for the person (2,000+ followers with sales under a twentieth of them, or the titles cite social media). `dealer` — a business, a volume seller, trade wording (lots, retail reference codes), or 200+ listings open. `gifted` — PR packages and samples in the titles. `vintage`, `luxury`, `kids`, `power`, `pro`, `celebrity`, `active` — the closet's own shape.

## `similarTo` (type: `array`):

Sellers whose closet you want matched — ids, profile URLs or usernames. Back come the members whose closets are most like theirs: half the fingerprint (what they sell, in what material, which era, which colours, which wording), half the brand overlap. Each row carries `similarity`, `tags_similarity`, `brand_overlap` and `shared_brands`. The targets themselves are never returned.

## `userIds` (type: `array`):

Members to read by Vinted id (the number in a profile URL, e.g. 15028320). Stored members answer from the census; others are read from Vinted now. Billed `user` for stored rows, `profile` for live ones.

## `profileUrls` (type: `array`):

Members to read by profile URL (https://www.vinted.fr/member/15028320-nina). Any Vinted country domain.

## `logins` (type: `array`):

Members to read by username (exact match, case-insensitive). Resolving a username Vinted knows but the census does not costs one live request.

## `followersOf` (type: `array`):

Members whose followers to list — ids, usernames or profile URLs. One `follower` row per follower, with the follower's own follower count, reviews and country, up to `maxPerUser` each.

## `followingOf` (type: `array`):

Members whose followed accounts to list — ids, usernames or profile URLs. One `following` row per followed account, up to `maxPerUser` each.

## `maxPerUser` (type: `integer`):

Lists mode: stop each followers / following list after this many rows (read 90 at a time).

## `fresh` (type: `boolean`):

Members mode: read every requested member from Vinted during this run, even when the census holds them, so counts are as of now. Every row is then billed `profile`.

## `includeItems` (type: `boolean`):

Attach the member's listings (`items`, up to `maxItemsPerMember`) to every member row — title, brand, size, condition, price, favourites, sold/open/gone state, sold price, photo. Billed `item` per listing.

## `itemsState` (type: `string`):

With `includeItems`: which listings to attach.

## `maxItemsPerMember` (type: `integer`):

With `includeItems`: stop each member's list after this many listings.

## `includeHistory` (type: `boolean`):

Attach every version of the member's record (which fields changed, when) and the follower/review count observations (`history`). Not billed separately.

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

Stop after this many rows across the whole run. With no start fee this is also your spending cap.

## Actor input object example

```json
{
  "sortBy": "followers",
  "minFollowers": 0,
  "businessOnly": false,
  "archetype": "",
  "section": "",
  "category": "",
  "minBrandItems": 1,
  "closetShares": [],
  "flags": [],
  "similarTo": [],
  "maxPerUser": 1000,
  "fresh": false,
  "includeItems": false,
  "itemsState": "all",
  "maxItemsPerMember": 100,
  "includeHistory": false,
  "maxItems": 100
}
```

# Actor output Schema

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

All scraped records in the default dataset. One row per seller (`kind` says how it was reached):

# 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 = {
    "closetShares": [],
    "flags": [],
    "similarTo": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("moxlade/vinted-users").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 = {
    "closetShares": [],
    "flags": [],
    "similarTo": [],
}

# Run the Actor and wait for it to finish
run = client.actor("moxlade/vinted-users").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 '{
  "closetShares": [],
  "flags": [],
  "similarTo": []
}' |
apify call moxlade/vinted-users --silent --output-dataset

```

## MCP server setup

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

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/IonlwaEH8SMucqqqu/builds/7uXtHBzTJtDfgIJNK/openapi.json
