# Vinted Scraper - Listings, Prices & New-Item Monitor (`amitaviv/vinted-scraper`) Actor

Scrape Vinted listings from search URLs or search text on all 26 Vinted country sites: title, brand, size, condition, price with buyer protection, favourites, photos, item URL, business sellers' names. Only-new mode for resellers. Optional item details. $0.60 per 1,000 items on Bronze.

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

## Pricing

from $0.48 / 1,000 items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper: listings, prices and new-item monitor

Returns Vinted listings from any search or catalogue URL, or from search text with filters, on all 26 Vinted country sites (vinted.fr, .de, .es, .it, .nl, .be, .pl, .co.uk, .com and the others). Plain HTTP with no browser: 100 items take from about 4 seconds to about 15, depending on how many come from business sellers (see "Speed"). Apart from the start fee you pay only for delivered items, and a run that delivers nothing because of an error ends as Failed, never as a green empty run.

### What you get

- Title, brand, size, condition (as the site shows it, plus a code that is the same on every site), item URL and id
- Price, currency, discounted price where shown, the buyer protection fee and the total the buyer pays before shipping
- Favourites count, promoted flag, main photo and thumbnail
- Seller type (`business` or `private`); for business sellers their Vinted seller id and the business name they trade under, legal name, legal form and country, read from one of the seller's item pages at no extra charge (once per seller per run; can be switched off for speed)
- With **Item details** on (extra charge): description, category and category path, colours, all photos, how long ago the item was uploaded as Vinted words it ("Il y a 2 heures"), availability, reserved flag
- The country site, the search that found the item, and when it was read
- One record per item, as JSON, CSV or Excel, or through the API
- A run summary (`OUTPUT_SUMMARY` in the run's key-value store): what was requested, delivered and charged, which inputs failed or were ignored, warnings, and why the run stopped

What it does not return: private sellers' ids, usernames, profile photos, locations or ratings (not by default, and usernames never); member pages (a person's wardrobe); sold items; shipping prices; view counts; an exact upload time (Vinted shows only "2 hours ago"); anything behind a login.

### How to use

1. Open Vinted in your country, search, set the filters you want (brand, size, condition, price, category, colour) and copy the URL from the browser.
2. Paste it into **Vinted search or catalogue URLs**. Several entries are fine, from different country sites too. Or type search text into **Search text** and use the filter fields.
3. Set **Max items per search** and press Start.
4. Download the results from the Output tab, or read them from the API.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `startUrls` | list of URLs | none | Vinted search URLs (`/catalog?search_text=…`), catalogue pages (`/catalog/1231-shoes`) and brand pages (`/brand/53-nike`) from any Vinted country site. Each URL keeps all its filters. Results come newest first unless the URL sets another order. Enter full URLs starting with `https://` (the input form rejects others); duplicates, other sites, member pages and single item pages are ignored and listed in the summary. |
| `searchQueries` | list of text | none | Instead of URLs: one search per line, newest first, on the site chosen in `country`. |
| `country` | choice | `fr` | Site for `searchQueries`: `fr de es it nl be pl uk us at pt lu ie cz sk hu ro lt lv ee fi se dk gr hr si`. |
| `priceMin`, `priceMax` | number | none | For `searchQueries`, in the site's currency; decimals allowed (`9.99`). A minimum above the maximum fails the run before any request. |
| `conditions` | list | all | For `searchQueries`: `new_with_tags`, `new_without_tags`, `very_good`, `good`, `satisfactory`. |
| `brandIds`, `sizeIds`, `categoryIds`, `colorIds` | list of numbers | none | For `searchQueries`: Vinted's own ids, as they appear in a Vinted URL after you pick the filter (`brand_ids[]=53` is Nike, `/catalog/1231-…` is category 1231). With no search text, the filters alone make one search of the whole site. |
| `maxItemsPerQuery` | number | 100 | Stop after this many items for each URL or search text (1 to 960). Vinted shows at most 960 per search. |
| `onlyNew` | yes/no | no | Monitoring: return and charge only items that earlier runs have not delivered. See "Monitoring". |
| `monitorKey` | text | empty | Name of the monitor memory, to keep two schedules apart. |
| `includeDetails` | yes/no | no | Read each item's page for the details listed above; charged per item whose page was read. Slower (see "Limits"). |
| `includeBusinessNames` | yes/no | yes | Fill business sellers' names from one item page per seller (free). Turn off for the fastest runs; `sellerType` and the business seller's id are still returned. |
| `includePrivateSellerData` | yes/no | no | Adds private sellers' numeric Vinted ids and keeps phone numbers and e-mail addresses that sellers wrote into descriptions. Turn on only if you have a lawful basis under the GDPR to process this personal data. |
| `proxyConfiguration` | proxy | off | Not needed. Vinted often refuses Apify's datacenter proxy addresses (HTTP 403); refused requests are retried on a new proxy session, which got through in one test run and stalled in another, so it does not cure a block. Residential proxy was not tested. |

Yes/no fields also accept the text `"true"` and `"false"` from the API; any other value is treated as the default and named in the run's warnings.

```json
{
  "searchQueries": ["zara"],
  "country": "pl",
  "priceMax": 50,
  "conditions": ["new_with_tags"],
  "startUrls": [
    { "url": "https://www.vinted.it/catalog?search_text=gucci&order=newest_first" },
    { "url": "https://www.vinted.es/brand/53-nike" }
  ],
  "maxItemsPerQuery": 60
}
```

This input was run as `7cYd35VWdGrx7vufh` on 2026-10-14: 180 items in 8 seconds, 60 per search; the Polish items all cost 50 PLN or less and are all "new with tags", the Spanish ones are all Nike.

### Example result

A business seller's item with **Item details** on, from run `vmEmgucOFvfcjftHo` (2026-10-14, build 0.1.9). The description and the photo list (8 URLs) are shortened here; nothing else is edited.

```json
{
  "id": "10368164503",
  "url": "https://www.vinted.fr/items/10368164503-jean-levis-510-skinny-w28-l28-bleu-tres-bon-etat-n809",
  "title": "Jean Levi's 510 | Skinny | W28 l28 | bleu | Très bon état | N809",
  "brand": "Levi's",
  "size": "W28 | FR 38",
  "condition": "Très bon état",
  "conditionCode": "very_good",
  "price": 19.9,
  "currency": "EUR",
  "discountedPrice": null,
  "buyerProtectionFee": 1.7,
  "totalPrice": 21.6,
  "favouritesCount": 0,
  "isPromoted": false,
  "photoUrl": "https://images1.vinted.net/t/06_0007c_7v6UCrFhX9rtzU3k7UHfw4JU/f800/4aa3ef9b.webp?s=600e28f4ff9aeb8226b7aaeb236cd8b669445ac9",
  "photoUrls": [
    "https://images1.vinted.net/t/06_0007c_7v6UCrFhX9rtzU3k7UHfw4JU/f800/4aa3ef9b.webp?s=600e28f4ff9aeb8226b7aaeb236cd8b669445ac9",
    "https://images1.vinted.net/t/06_001f2_WiZniTZD7daf4bNCz9uWiLLD/f800/cec6a25f.webp?s=c4526b4134e66eb775d5be96dc7b80c43d792c82",
    "… 6 more"
  ],
  "thumbnailUrl": "https://images1.vinted.net/t/06_0007c_7v6UCrFhX9rtzU3k7UHfw4JU/310x430/4aa3ef9b.webp?s=8a8a5dae57051bb8aac60be5e46418ab2f470240",
  "sellerType": "business",
  "sellerId": "3130790208",
  "businessName": "FreePrix",
  "privateDataRedacted": false,
  "detailsFetched": true,
  "description": "Bonjour,\n\n🎁 -10% pour les abonnés!\n\nModèle 510 → Jean Levi's coupe : \"Skinny\"\nCatégorie : Homme\nTaille : \"W28 L28\"\nCouleur :Jean \"Bleu\" traditionnelle Lévis\nEta …",
  "category": "Hommes Jeans skinny",
  "categoryId": "1817",
  "categoryPath": [
    "Hommes",
    "Vêtements",
    "Jeans",
    "Jeans skinny"
  ],
  "color": "Bleu",
  "uploadedAgo": "Il y a une minute",
  "availability": "InStock",
  "isReserved": false,
  "businessLegalName": "FRIPRIX",
  "businessLegalForm": "legal_business",
  "businessCountry": "FR",
  "country": "fr",
  "query": "https://www.vinted.fr/catalog?search_text=levis%20501&order=newest_first",
  "searchUrl": "https://www.vinted.fr/catalog?search_text=levis%20501&order=newest_first",
  "scrapedAt": "2026-10-14T15:34:48.343Z"
}
```

| Field | Meaning |
|---|---|
| `id` | Vinted's item id; stable between runs. |
| `brand` | `null` when the seller gave no brand. |
| `condition`, `conditionCode` | Condition in the site's language, and the same condition as `new_with_tags`, `new_without_tags`, `very_good`, `good` or `satisfactory` on every site. |
| `price`, `currency` | The asking price in the site's currency (items from another country are shown converted, as Vinted shows them). |
| `discountedPrice` | Set when Vinted shows a reduced price, else `null`. |
| `buyerProtectionFee`, `totalPrice` | Vinted's buyer protection fee and price + fee, as the site shows them. Shipping is not included. |
| `isPromoted` | A promoted listing Vinted inserted into the results. |
| `sellerType` | `business` (a professional seller registered as such on Vinted) or `private`. |
| `sellerId` | The business seller's Vinted id; `null` for private sellers unless `includePrivateSellerData` is on. |
| `businessName`, `businessLegalName`, `businessLegalForm`, `businessCountry` | From the business's legal information on an item page of that seller, read once per seller per run and copied to all the seller's items. They are `null` when `includeBusinessNames` is off, or when Vinted refused that seller's item pages twice; the status message then says for how many items. A sole trader's business name can be a person's name. |
| `privateDataRedacted` | `true` for a private seller whose id was left out. |
| `detailsFetched` | `true` when the item page was read for the details (`includeDetails`). |
| `uploadedAgo` | Vinted's own words, in the site's language. |
| `query`, `searchUrl` | The search as you gave it, and the URL that was read. |

Fields Vinted does not provide for an item are `null`, never missing.

### Pricing

Pay per event.

| Event | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Actor start (once per run at the default 512 MB) | $0.0036 | $0.003 | $0.0027 | $0.0024 |
| Item delivered | $0.00072 | $0.0006 | $0.00054 | $0.00048 |
| Item details read (`includeDetails`), per item | $0.0012 | $0.001 | $0.0009 | $0.0008 |

Worked examples on Bronze: one search of 1,000 items costs $0.003 + 1,000 × $0.0006 = $0.603; with item details, + 1,000 × $0.001 = $1.603. A scheduled monitoring run that finds 20 new items costs $0.003 + 20 × $0.0006 = $0.015; a run that finds nothing new costs $0.003.

- Items that could not be delivered are not charged. An item found twice in one run (by two searches, or on two result pages) is delivered and charged once; an item another search of the same run already delivered does not count against this search's maximum. Item details are charged only for items whose page was read.
- The start event is charged by Apify once per GB of run memory: once at the default 512 MB, more if you raise the memory.
- The maximum total charge you set for a run is respected: the actor stops before it would go over, keeps what was delivered, and says so in the status message (run `4zP2uYnq2f2VhASg2`: a $0.0072 limit gave exactly 7 items).

### Reliability and failure behaviour

| What happened | Run status | Status message |
|---|---|---|
| Items delivered | Succeeded | `Scraped 180 items from 3 queries` |
| Items delivered, some business names not read | Succeeded | `Scraped 2880 items from 3 queries — business name not read for 2 items (Vinted refused the item pages; businessName: null); …` |
| A full search read, but some of its items never appeared | Succeeded | `Scraped … — Vinted moved items between its result pages while they were read, so N items of the M it counts for … never appeared` |
| Vinted has no items for your search | Succeeded | `0 results: Vinted has no items for this query` |
| Some searches worked, some failed | Succeeded | `Scraped 197 items from 2 queries — 1 of 2 queries failed ("…": …)` |
| Nothing delivered because of errors or blocking | **Failed** | `No items delivered: Vinted blocked every attempt; try again later. No items were charged (the start fee applies).` |
| Input the actor cannot use | **Failed**, within 2 seconds | `Nothing to do: … Add at least one entry to "startUrls", e.g. … No items were charged (the start fee applies).` |
| Maximum charge reached | Succeeded | `Scraped 7 items from 1 query — stopped at the maximum charge set for this run` |
| Run timeout close | Succeeded | `… — stopped just before the run timeout; raise the timeout to get the rest` |
| Vinted's page no longer holds the data this actor reads | **Failed** | `No items delivered: Vinted's page did not contain the catalogue data this actor reads (layout change?) …` |

- Requests are retried with increasing pauses on network errors, HTTP 429 and 5xx; refusals are named in the log as they happen.
- Results are saved page by page. A run that is aborted, times out or is resurrected keeps what was delivered and never delivers or charges the same item twice.
- Measured on 2026-10-14 (41 test runs in all; the last 16 on the current code): every run delivered what was asked or ended with the right status (normal, multi-country, 3 × 960, details, monitoring, empty search, bad input, charge limit), and in every run the items charged equal the items delivered. No run met a block on result pages; item pages answered HTTP 429 (rate limit) at times and were waited out (`bhlYsmve9e691FUPG`: 5 refusals, 40 of 40 details read). The blocked and layout-change paths were verified in offline simulations only.

### Limits

- **960 items per search.** Vinted shows at most 10 pages of 96 for any search. When Vinted's count for a search reaches 960, the status message says so: narrow it with filters (price bands, sizes, categories) to reach the rest. Splitting a search automatically is not built.
- **Result pages move while they are read.** Newest first, new listings push older ones down, and even on quiet searches Vinted's pages overlap from one request to the next: a reading of "barbour bedale olive 46" on vinted.ie (600 items by Vinted's count) once showed only 575 distinct items (`oXfdr6LqezaDNZ6Oz`, previous build). So the pages a run needs are requested together, and when a search read to its end showed repeated items, all its pages are read a second time and the items not seen before are added: the same search then gave 686 distinct items (`QkQfKbQ71mJvaCK1r`; Vinted's pages vary between requests, so a full reading can return more items than Vinted counts). If fewer distinct items than Vinted's count still came, the status message says how many never appeared. Nothing is charged twice.
- **Speed.** Without details, result pages take a few seconds each and the rest depends on business sellers, whose names need one item page per seller, paced at about one a second because Vinted rate-limits item pages: 100 items with no business seller in 3.7 s (`LlR2xdOWZH46hUQyT`); 300 items from 25 business sellers in 35 s (`SrrF6p5ZVKExy3L9W`); 6 searches × 96 on six sites in 30 s (`di9blT85Zrehyew60`); 3 × 960 with 58 business sellers in 175 s (`Nvd4E9ZODnNeW4dVs`, about 1,000 items a minute). Turn off `includeBusinessNames` for the fastest runs. With **Item details** on, every item needs its page: about 25 to 50 items a minute, depending on how often Vinted rate-limits item pages (40 in 86 s, `bhlYsmve9e691FUPG`; 100 in 260 s, `bhMk8UVNAna8Pd2Sp`; 30 in 37 s, `KdkEn0fWhaiLuIYQF`).
- **Order.** Searches are read newest first unless the URL you paste sets another order; with **Only new items** they are always read newest first.
- **Upload time** is only Vinted's relative wording, and only with item details.
- **Category** of an item comes only with item details (the search results do not carry it; a category filter in the search also matches its sub-categories, so it is not the item's own category).
- Countries: the 26 Vinted sites listed under `country`. The condition codes were checked on all 26.

### Monitoring: only new items

1. Turn on **Only new items** and save the input as a task.
2. Schedule the task (every 10 minutes, hourly, daily).
3. The first run delivers what it finds (up to the maximum). Every later run reads newest first and delivers and charges only items it has not delivered before for the same search; a run with nothing new ends as Succeeded with `0 new items…` and charges only the start event.

Tested on 2026-10-14: a quiet search on vinted.ie ("longchamp pliage") delivered 200, then 1, then 1, then 0 items in four runs (`fc7qDM9FXphCKrkte`, `wYadaLyqlxx8deaPr`, `Amu0k5M37XcMXOsxF`, `rnkGVUCK5WMn4GOZi`), no item twice. On the current build, a new monitor on the same search delivered 200, then 0 (`hiYJM0ZuC9IQnVeOn`, `0CBWxSghrBDyKIY7V`), and one on "nike" (vinted.de) delivered 300, then a few minutes later 126 others with no overlap, reading 2 pages (`5Qdl8lC9ssxpQf7gO`, `npXdVp0CnwMSb4XzF`). A busy one ("nike" on vinted.de) delivered 200 and, 25 minutes later, 200 others with no overlap (`QFAfU8azhI4HIVkLH`, `2FE3RnNnezFib2OjM`); the second run said that more than 200 new items had arrived, so raise the maximum or run more often for such searches.

"New" means "not delivered before by this monitor". Vinted's newest-first order also brings back some older listings that sellers have bumped to the top: if this actor has not delivered them before, they come as new. A later run reads down to the first page where at least a quarter of the items are known, so a few bumped items do not stop it early.

The memory is a key-value store named `vinted-scraper-monitor` in your own account (one record per search and monitor name, at most 10,000 ids each, oldest forgotten first). Delete the store or change **Monitor name** to start over. Items cut off by the maximum or by your charge limit in a later run are not delivered by the next one (the status message warns you), so set the maximum above what arrives between two runs. To be notified, add an integration to the task (email, Slack, webhook) on "run succeeded" and check that the dataset is not empty.

### FAQ

**Do I need a proxy or a Vinted account?** No. The actor does not log in and reads only public pages, without a proxy. Apify's datacenter proxy addresses are often refused by Vinted.

**Why did I get fewer items than Vinted shows?** Vinted shows at most 960 per search, and its result pages move while they are read; the actor reads them a second time when that happens, and the status message says how many items never appeared (see "Limits"). The run summary lists per search how many items were found, delivered, repeated and recovered (`pageShift`).

**Why do I get items for a word that makes no sense?** Vinted matches search text loosely, so an unusual word can still return loosely related items (17 items for "qxzvjkwpl zzyqmb", `VpGmXkdg2eJ3Alm3s`); the actor returns what Vinted returns. `0 results` comes only when Vinted itself finds nothing, e.g. with a narrow price band. Use filters or a pasted URL to narrow.

**How do I find a brand, size or category id?** Pick the filter on Vinted and look at the URL: `brand_ids[]=53`, `size_ids[]=207`, `catalog[]=1231`. Or simply paste that URL into `startUrls`.

**Can I run it from code?** Yes: the API, the Apify clients for JavaScript and Python, Make, Zapier, n8n. The Output tab shows the URLs.

**What happens when Vinted changes its pages?** Runs fail with a message that names the problem instead of returning empty data; report the run id under Issues.

### Legal and responsible use

This actor collects listing data that Vinted shows publicly without a login: item, price and condition data, and the legal information Vinted publishes about business sellers (for a sole trader, the business and legal name can be a person's name; it is returned because Vinted publishes it as trader information, and `includeBusinessNames: false` without item details leaves it out). Most Vinted sellers are private individuals. By default the actor does not return their ids, usernames, profile photos, locations or ratings, and it removes phone numbers and e-mail addresses that sellers write into descriptions; records carry `sellerType` and `privateDataRedacted`. Item photos are returned as Vinted shows them and can show people. The optional `includePrivateSellerData` adds private sellers' numeric ids; use it only with a lawful basis under the GDPR.

Vinted's terms are reported to forbid bots and automated collection (we could not read the clause ourselves); treat use of this actor as against those terms. You are responsible for how you use the data: respect Vinted's terms, copyright and database rights, and data-protection law (GDPR and others) in your country and the country of the data. Do not use the output to contact, profile or track individual sellers, or for unsolicited marketing. If you are unsure, ask a lawyer before you build on it.

### Related actors

Other actors by the same developer:

- [Listing Status Checker](https://apify.com/amitaviv/property-listing-status-checker): paste Vinted item URLs you already have and get, per item, whether it is still online, reserved or sold (`saleConfirmed: true` for a sale through Vinted's checkout) and its current price against the last check. Useful for measuring how fast items sell after you collect them with this actor.
- [Leboncoin Scraper](https://apify.com/amitaviv/leboncoin-scraper): ads from leboncoin.fr, France's largest classifieds site, in every category including clothing and accessories, to compare second-hand prices in France beyond Vinted.
- [Kleinanzeigen Scraper](https://apify.com/amitaviv/kleinanzeigen-scraper): ads from kleinanzeigen.de, Germany's largest classifieds site, in every category, to compare second-hand prices in Germany beyond Vinted.

### Changelog

- 2026-10-14 0.1: first release.

### Support

Open an issue on the actor's **Issues** tab with the run id.

# Actor input Schema

## `startUrls` (type: `array`):

Set your search and filters on any Vinted country site (vinted.fr, .de, .es, .it, .nl, .be, .pl, .co.uk, .com, …), then copy the full URL (starting with https://) from the address bar, e.g. https://www.vinted.fr/catalog?search_text=levis%20501\&order=newest_first. Catalogue pages (/catalog/1231-shoes) and brand pages (/brand/53-nike) work too. Each URL is one search and keeps all its filters. Results come newest first unless the URL sets another order. Give URLs here, search text below, or both; at least one entry in either is required. Member pages and single item pages are ignored.

## `searchQueries` (type: `array`):

Instead of URLs: one search per line (e.g. levis 501), run on the country site chosen below, newest first. The price, condition, brand, size, category and colour fields below apply to these searches only, not to URLs. Empty by default.

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

Vinted site the search text runs on (default fr, vinted.fr). Prices in the output are in that site's currency (EUR, GBP, USD, PLN, CZK, …). Has no effect on pasted URLs, which keep their own site.

## `priceMin` (type: `number`):

For search text: lowest item price, in the country site's currency (decimals allowed, e.g. 9.99).

## `priceMax` (type: `number`):

For search text: highest item price, in the country site's currency (decimals allowed, e.g. 19.99).

## `conditions` (type: `array`):

For search text: only items in any of these conditions, e.g. \["new_with_tags", "very_good"]. Empty (default) = all conditions.

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

For search text: Vinted brand ids, e.g. 53 for Nike. Find one by choosing the brand on Vinted: it is the number in brand_ids\[]=… in the URL (or in /brand/53-nike).

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

For search text: Vinted size ids, e.g. 207 (the number in size_ids\[]=… after choosing a size on Vinted). Size ids depend on the category.

## `categoryIds` (type: `array`):

For search text: Vinted category ids, e.g. 1231 for men's shoes (the number in catalog\[]=… or in /catalog/1231-shoes).

## `colorIds` (type: `array`):

For search text: Vinted colour ids (the number in color_ids\[]=… after choosing a colour on Vinted).

## `maxItemsPerQuery` (type: `integer`):

Maximum number of items to deliver for each URL or search text, 1 to 960 (default 100). Vinted shows at most 960 items for one search. You are charged only for delivered items.

## `onlyNew` (type: `boolean`):

Return and charge only items that earlier runs of this actor in your account have not delivered for the same search. The first run delivers what it finds (up to the maximum); schedule the actor to get only fresh listings. Searches are read newest first. The memory is a key-value store named vinted-scraper-monitor in your account; delete it to start over.

## `monitorKey` (type: `string`):

Only with "Only new items". A free-text name (e.g. nike-fr-hourly). Runs with the same search and the same monitor name share one memory; give two schedules different names to keep their memories apart. Empty by default.

## `includeDetails` (type: `boolean`):

Off by default. On: open each item's page for its description, category, colour, all photos, how long ago it was uploaded and whether it is reserved. One extra page per item, charged as an "item-details" event only for items whose page was read. Slower: Vinted rate-limits item pages, so expect about 25 to 50 items a minute instead of hundreds.

## `includeBusinessNames` (type: `boolean`):

On by default: for items from business (professional) sellers, read one item page per seller to fill the business name, legal name, legal form and country. Free, but item pages are rate-limited by Vinted, so searches with many business sellers run slower; turn off for speed. Each seller is looked up once per run. With "Item details" on, the names come with the details anyway.

## `includePrivateSellerData` (type: `boolean`):

Off by default: for private (non-business) sellers the seller id is left out and phone numbers and e-mail addresses in descriptions are removed. On: private sellers' numeric Vinted ids are added and contact details in descriptions are kept. Turn on only if you have a lawful basis under the GDPR (and similar laws) to process this personal data.

## `proxyConfiguration` (type: `object`):

Off by default: Vinted's pages need no proxy. Apify's datacenter proxy addresses are often refused by Vinted (HTTP 403); refused requests are retried on a new proxy session, which sometimes gets through and sometimes does not, so turning it on does not cure a block. Residential proxy was not tested.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.vinted.fr/catalog?search_text=nike%20air%20max&order=newest_first"
    }
  ],
  "country": "fr",
  "maxItemsPerQuery": 100,
  "onlyNew": false,
  "includeDetails": false,
  "includeBusinessNames": true,
  "includePrivateSellerData": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One JSON object per delivered item: id, url, title, brand, size, condition, conditionCode (same code on every site), price, currency, discountedPrice, buyerProtectionFee, totalPrice (price + fee, before shipping), favouritesCount, isPromoted, photoUrl, photoUrls, thumbnailUrl, sellerType (business or private), sellerId and businessName (business sellers), country (site code), query, searchUrl, scrapedAt. With item details also description, category, categoryPath, color, all photos in photoUrls, uploadedAgo, availability and isReserved. Missing values are null.

## `resultsCsv` (type: `string`):

The same items as a CSV file, one row per item.

## `summary` (type: `string`):

JSON record OUTPUT_SUMMARY: items found and delivered per search, events charged, failed or ignored inputs, warnings, and why the run stopped.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.vinted.fr/catalog?search_text=nike%20air%20max&order=newest_first"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("amitaviv/vinted-scraper").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 = {
    "startUrls": [{ "url": "https://www.vinted.fr/catalog?search_text=nike%20air%20max&order=newest_first" }],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("amitaviv/vinted-scraper").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 '{
  "startUrls": [
    {
      "url": "https://www.vinted.fr/catalog?search_text=nike%20air%20max&order=newest_first"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call amitaviv/vinted-scraper --silent --output-dataset

```

## MCP server setup

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

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/VeSbZofJbhUs9W8Y3/builds/IDwObqyOfng9UWlYk/openapi.json
