# OLX Brazil Scraper - Past the 5,000-Listing Search Wall (`webdata_labs/olx-brazil-scraper`) Actor

\[$1.50 / 1K, no start fee] OLX Brasil listings past the 5,000-per-search wall: the Actor slices a big search into price bands on its own. Price drops, CEP, neighbourhood and category attributes per listing; descriptions and seller sales history are an opt-in extra.

- **URL**: https://apify.com/webdata\_labs/olx-brazil-scraper.md
- **Developed by:** [WebData Labs](https://apify.com/webdata_labs) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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?

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

## OLX Brazil Scraper

**Every listing on Brazil's largest classifieds site, including the ones OLX stops serving after 5,000.**

Ask OLX for "iphone" and it tells you there are 107,000 matches. Then it hands you 100 pages of 50 and stops: page 101 is page 100 again, page 500 is page 100 again. Every OLX scraper hits that wall, and most just tell you to split the search by hand. This one splits it for you, cutting the query into price bands and then into states until every slice fits under the ceiling, so "all of it" is an answer you can actually get.

### ✅ What you get / ❌ what this isn't

| ✅ What you get | ❌ What this isn't |
|---|---|
| **Past the 5,000-per-search ceiling** by automatic price-band and state splitting | Not a pager that quietly returns page 100 five times and calls it 5,000 rows |
| **50 real listings per page**, with OLX's empty ad slots skipped | Not a row count padded with placeholder cards that carry no listing at all |
| **Seller history**: completed sales, cancelled sales, average dispatch time, top-rated flag | Not just a seller name and a "business or private" guess |
| **Exact location**: state, city, neighbourhood, CEP postal code, DDD area code | Not "São Paulo" and nothing narrower |
| **OLX's own filters** for price, condition, top-rated sellers, sent at the source | Not a full scan of the category that throws away 90% of what you paid to fetch |
| **Category attributes** parsed per listing: brand, model, storage, battery health, condition | Not a description blob you have to regex yourself |
| **Detail pages priced separately** so you only pay for the expensive half when you want it | Not one flat price that charges everybody for the depth most runs never use |

### 🔎 Why use this Actor

- **Breaks the 5,000 wall.** OLX serves at most 100 pages of 50 for any one search. When a search has more matches than that, the Actor bisects it on price using the prices on the page it just read, so the split adapts to the category: about R$1,500 for phones, hundreds of thousands for property. When price runs out of room it splits across the 27 states instead.
- **Stops paging on evidence, not on a link.** A page ends a search when it serves no listing ID that slice has not already returned. OLX answers page 101 with page 100 rather than an error, so anything that trusts a next-page affordance pages forever.
- **Empty ad slots never become rows.** A page of results is 57 cards: 50 listings and about seven advertising placeholders that OLX ships with no listing ID, no title and no location, for the browser to fill from an ad network. They are dropped before anything is counted or charged. Listings the seller *paid to highlight* are real and are kept, flagged as `isFeatured`.
- **Filters go to OLX where OLX supports them.** Price range, condition, top-rated sellers and private-only are query parameters, not post-filters, so a narrow search does not cost you the rows it rejects. The two OLX cannot express - business-sellers-only and a highest-price sort - are applied here, and the README says which is which.
- **Seller quality, not just seller identity.** Enriched rows carry the account's completed and cancelled sale counts, its average dispatch time, whether OLX rates it above four stars, and whether a phone number is on file at all.
- **Regional URLs keep working.** OLX answers `sp.olx.com.br/celulares?q=iphone` with a redirect to its bare homepage, dropping the category and the query. Pasted regional links are rewritten into the path OLX actually routes on.
- **Pay per listing you receive.** No start fee. Deduplicated by listing ID across every search, slice and page in the run, so an overlapping split never bills you twice for the same ad.

### 👥 Who it's for

Resale and arbitrage operators, Brazilian real-estate and auto aggregators, price-intelligence teams, and B2B prospectors looking for active sellers in a region.

- Build a price curve for one phone model, car model or appliance across all 27 states.
- Pull a whole `imoveis/venda` region as an inventory feed instead of a 5,000-row sample.
- Build a call list of business sellers in one state, with city, neighbourhood, DDD and sales history.
- Track what a category is asking week over week by re-running the same search on a schedule.
- Watch for listings published in the last 24 hours under a price cap.

### Example tasks

- [Scrape OLX apartments and houses for sale in São Paulo](https://apify.com/webdata_labs/olx-brazil-scraper/examples/olx-imoveis-venda-sao-paulo)
- [Scrape used cars on OLX by state](https://apify.com/webdata_labs/olx-brazil-scraper/examples/olx-carros-usados-por-estado)
- [Track iPhone prices across Brazil](https://apify.com/webdata_labs/olx-brazil-scraper/examples/olx-iphone-prices-brazil)
- [Build a lead list of OLX business sellers](https://apify.com/webdata_labs/olx-brazil-scraper/examples/olx-business-sellers-lead-list)
- [Scrape OLX rentals in Rio de Janeiro](https://apify.com/webdata_labs/olx-brazil-scraper/examples/olx-imoveis-aluguel-rio-de-janeiro)
- [Monitor OLX listings published today](https://apify.com/webdata_labs/olx-brazil-scraper/examples/olx-new-listings-today)
- [Find motorcycles on OLX under R$10,000](https://apify.com/webdata_labs/olx-brazil-scraper/examples/olx-motos-ate-10-mil-reais)
- [Pull a whole OLX category past the 5,000 limit](https://apify.com/webdata_labs/olx-brazil-scraper/examples/olx-categoria-completa-acima-de-5000)
- [Scrape electronics from top-rated OLX sellers](https://apify.com/webdata_labs/olx-brazil-scraper/examples/olx-eletronicos-vendedores-bem-avaliados)

### ⚙️ How to scrape OLX Brazil

1. Type what you are looking for into **Search terms** - Portuguese or English, one term per line. Or paste an olx.com.br URL into **OLX search URLs** if you already built the search on the site.
2. Narrow it if you want to: **Category**, **State**, **Minimum/Maximum price**, **Condition**, **Seller type**, **Only top-rated sellers**, **Published within**.
3. Leave **Max results** at 100 for a first run. Set it to 0 for everything OLX has.
4. Turn on **Include description and seller details** only if you need descriptions, CEP or seller history. It is charged separately.
5. Click **Start**. Rows appear in the dataset as each page is parsed, so you can watch and stop early. Export from the **Output** tab as JSON, CSV, Excel or an API feed.

#### Get more than 5,000 listings

Leave **Go past OLX's 5,000-listing limit** on and set **Max results** above 5,000 (or to 0). The Actor reads OLX's own match count on the first page of each search; if it is over the ceiling and your budget wants more, it splits the search on price and works the pieces depth-first. A search for "iphone" with a budget of 20,000 becomes a tree of price bands, each under the ceiling, all deduplicated into one dataset.

#### Get a fresh list on a schedule

Set **Published within (days)** to 1 and **Sort by** to "Newest first", save it as a task, and schedule it daily. The timestamp used is OLX's real publication time, not the bump that pushes an old ad back to the top of the page, so a re-listed three-month-old ad does not show up as new.

### 📥 Input

```json
{
    "searchQueries": ["iphone 13"],
    "category": "celulares",
    "state": "SP",
    "minPrice": 1000,
    "maxPrice": 3000,
    "condition": ["Used - excellent"],
    "sellerType": "private",
    "sortBy": "newest",
    "enrichDetails": false,
    "maxResults": 100
}
```

- `searchQueries` - what to search for, one search per entry. Results are merged and deduplicated.
- `searchUrls` - any olx.com.br listing URL. Filters already in the URL win over the form.
- `category` - one of 160 OLX categories, picked by name. Required for `condition` and `onlyGoodSellers` to have any effect.
- `state` - two-letter UF code. Applied at the source.
- `listingUrls` - scrape named ads instead of searching. Full URLs or bare listing IDs. Search filters do not apply to these.
- `minPrice` / `maxPrice` - BRL, inclusive, applied by OLX. Listings with no published price drop out once either is set.
- `condition` - New, Used - excellent, Used - good, Refurbished, For parts or damaged. Needs a category.
- `sellerType` - `any`, `private` or `business`. Private is applied by OLX; business is applied here.
- `onlyGoodSellers` - sellers OLX rates above four stars. Needs a category, and cuts results hard.
- `publishedWithinDays` - 0 means any age. Uses the real publication time, not the bump.
- `sortBy` - `relevance`, `newest`, `price_asc`, `price_desc`. The first three are OLX's own ordering.
- `splitLargeSearches` - on by default. The 5,000-ceiling split described above.
- `enrichDetails` - off by default, charged separately. Adds description, CEP, seller identity and sales history.
- `maxResults` - default 100, `0` for unlimited. No hard ceiling.

Field names from other OLX Actors are accepted as aliases, so input JSON copied from a competitor's docs runs here without editing: `startUrls`, `urls`, `query`, `keywords`, `maxItems`, `limit`, `includeDetails`, `includeBusinessOnly`, `priceMin`, `priceMax`, `sort`.

### 📤 Output

| title | price | categoryName | state | municipality | neighbourhood | sellerType | postedAt |
|---|---|---|---|---|---|---|---|
| Apple iPhone 11 (128gb) - Branco | 1000 | Celulares e Smartphones | SP | Atibaia | Cidade Satélite | private | 2026-08-04T23:03:46Z |
| iPhone 13 128 gb com caixa e capa | 2100 | Celulares e Smartphones | MG | Juiz de Fora | São Pedro | private | 2026-08-04T23:00:10Z |
| Honda Civic EXL 2019 automático | 105800 | Carros, vans e utilitários | RJ | Niterói | Icaraí | business | 2026-08-03T14:21:08Z |

Every row also carries `listingId`, `url`, `priceDisplay`, `previousPrice` and `hasPriceDrop` for price-cut tracking, `currency`, `categoryId` and `parentCategoryId`, `areaCode` (DDD), `postedAtEpoch`, `bumpedHoursAgo`, `isFeatured`, the OLX Pay and OLX Delivery flags, `offersInstallments`, `imageCount`, `videoCount`, `thumbnailUrl`, the full `images` array, an `attributes` object with the category's own fields (brand, model, storage, battery health, condition, accepts trades), and the `searchUrl` and `searchQuery` that found it.

With `enrichDetails` on, rows additionally carry `description`, `zipcode` (CEP), `region`, `replyCount`, and the seller block: `sellerName`, `sellerId`, `sellerPublicId`, `sellerIsProAccount`, `sellerIsGoodSeller`, `sellerSalesCount`, `sellerCanceledSalesCount`, `sellerAverageDispatch`, `phonePublished`, `phoneVerified`, `whatsappEnabled`.

Five dataset views ship with the Actor - Listings, Sellers, Prices, Locations and Descriptions - so the Output tab is readable without building a transformation first.

### 💵 How much does it cost?

**\[💵 $1.50 / 1K listings · no start fee]**, charged per listing delivered to your dataset. Nothing is charged for pages scanned, ad slots skipped, rows filtered out, duplicates removed, or the requests the ceiling split spends planning.

Turning on **Include description and seller details** adds **\[💵 $1.50 / 1K]** on the `listing-enriched` event, and only for listings you actually receive. That is not a markup: an OLX listing page weighs about 190 times what a search result costs to fetch, and putting it on its own event is what keeps the base price at $1.50 for the majority of runs that never need it.

A typical run: 100 listings for $0.15, or 5,000 for $7.50. The same 5,000 with full descriptions and seller history costs $15.00. Higher Apify plans pay less per listing on both events.

### 🔁 Run it on the Apify platform

Schedule the Actor daily or weekly from the Console, or start it from the API and read the dataset back as JSON, CSV, Excel or XML. Results can be pushed straight into Make, Zapier, n8n, a webhook, Google Sheets, S3 or your own CRM through Apify's integrations, and the Actor is available to AI agents over MCP.

### ⚠️ Limits and caveats

- **OLX serves at most 5,000 listings per search.** Page 101 returns page 100 again, so this is a hard ceiling, not a paging trick. The Actor works around it by splitting the search, but a single slice still cannot exceed 5,000 - and a slice that cannot be narrowed further (one price, one state) will stop there, with a warning in the log.
- **The match count OLX shows is not a row count.** It drifts by dozens between two identical requests and is consistently larger than what the pager will serve. Treat it as a planning number.
- **Phone numbers are never published.** OLX hides them behind its own contact flow. Enriched rows report `phonePublished` and `phoneVerified` so you know a number exists and was verified, but the digits are not available to any scraper.
- **Condition and top-rated-seller filters need a category.** OLX silently ignores them on an all-of-OLX search. Set `category`, or use a category URL. The run logs a warning when you have not.
- **There is no highest-price sort at the source.** OLX's own URLs cannot express it. `price_desc` sorts the listings the run collected, and only on runs capped at 10,000 or fewer, so it reorders your results rather than changing which ones OLX serves. For a genuine highest-price search, set a high `minPrice`.
- **Business-sellers-only is applied after fetching.** OLX's seller-type parameter only expresses private-only. In categories where professionals are rare (phones are about 6% business) a business-only run scans many rows to deliver a few. You are only charged for the ones delivered.
- **Some listings have no price.** "Sob consulta" ads return `price: null`, and any price bound excludes them.
- **Brazilian residential exits are required.** OLX's protection blocks datacenter addresses outright, so this Actor runs on residential IPs. Nothing to configure, and it is why enriched rows are priced the way they are.

### 🧩 Related Actors

- **Brazil CNPJ Company API** - turn a business seller into a registered company record: legal name, CNPJ, address, activity codes.
- **ReclameAqui Scraper** - check a Brazilian seller's or brand's complaint record before you buy or prospect.
- **Craigslist Scraper** - the same job on the largest US classifieds site, for cross-market price comparison.
- **eBay Sold Listings Scraper** - what an item actually sold for, against what OLX is asking for it.
- **Mercari Sold Comps Scraper** - a second resale benchmark for electronics and collectables.
- **Google Maps Business Scraper API** - find the physical storefront and phone behind an OLX business seller.
- **Lead List Deduplicator** - merge repeat runs into one clean list before it reaches your CRM.

### ❓ FAQ

#### Can I really get more than 5,000 listings from one search?

Yes, but not from one *query*. OLX caps every query at 5,000. The Actor turns your query into a tree of narrower queries on price and then on state, each under the cap, and deduplicates the results into a single dataset. Leave `splitLargeSearches` on and set `maxResults` above 5,000.

#### Am I charged for listings I filtered out?

No. You are charged for rows delivered to the dataset. Advertising placeholders, duplicates across slices, rows that fail your price or seller filter, and every page fetched to plan a split are all free.

#### Does it return the seller's phone number?

No, and neither does anything else. OLX does not publish the digits. You get `phonePublished` and `phoneVerified` flags, plus the DDD area code of the listing.

#### Which parts of Brazil does it cover?

All 27 federal units, by their two-letter UF code, plus the region and city that OLX itself assigns to each listing. Enriched rows carry the full eight-digit CEP.

#### Do I need to configure a proxy?

No. Proxying, session rotation and pacing are handled internally and included in the per-listing price. There is nothing to switch on and nothing to switch off.

#### Why is `description` empty?

Descriptions live on the listing page, not in search results. Turn on **Include description and seller details**. It is charged as a separate event because listing pages are far more expensive to fetch.

### 🛠️ Support

Open an issue on the Actor's Issues tab with the run URL, the input you used, and what you expected. That is the fastest path to a fix.

### ⭐ Rate this Actor

If this saved you time, please leave a review on the Reviews tab. Reviews are the main trust signal a buyer has on the Store, and they decide what gets built next here. If something is broken or a field is missing, please open an issue first - most things are fixed within a day, and a fixed Actor is more useful to you than a one-star rating.

### Changelog

#### 0.1 - 2026-08-05

- First release. Search by term, category, state, price, condition, seller type and top-rated seller.
- Automatic splitting past OLX's 5,000-listing ceiling, on price bands and then on states.
- Optional detail enrichment: description, CEP, seller identity and sales history.
- Advertising placeholders detected and excluded from the row count.

### Is it legal to scrape OLX?

Scraping publicly available pages is legal in most jurisdictions, and this Actor reads only what OLX serves to any visitor without logging in: no account, no login wall, no paywall. It does not collect personal data beyond what a seller chose to publish on a public advertisement, and OLX itself never publishes phone numbers or full addresses. If you plan to store or process seller names commercially, check your obligations under Brazil's LGPD and the GDPR where they apply to you. You are responsible for how you use what you collect.

# Actor input Schema

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

What to search OLX Brasil for, in Portuguese or English. Each term becomes its own search and the results are merged and de-duplicated by listing ID. Example: "iphone 13", "honda civic".

## `searchUrls` (type: `array`):

Paste any olx.com.br listing URL with your filters already applied and the Actor takes it from there, including category and state paths such as https://www.olx.com.br/imoveis/venda/estado-sp. Filters set in this form fill the gaps the URL leaves; anything the URL already says wins. Regional sp.olx.com.br style links are rewritten so they keep working.

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

Restrict the search to one OLX category. Also required for the condition and top-rated-seller filters below, which OLX only applies inside a category. Leave empty to search all of OLX.

## `state` (type: `string`):

Two-letter Brazilian state code (UF). Leave empty to search the whole country. The state is applied at the source, so it never costs you scanned rows.

## `listingUrls` (type: `array`):

Scrape named listings instead of searching. Full OLX ad URLs, or bare listing IDs. Search filters are not applied to these.

## `minPrice` (type: `integer`):

Lowest asking price in Brazilian Reais, inclusive. Applied by OLX itself. Listings with no published price are excluded once you set a price bound.

## `maxPrice` (type: `integer`):

Highest asking price in Brazilian Reais, inclusive. Applied by OLX itself.

## `condition` (type: `array`):

Keep only listings in these conditions. OLX only applies this inside a category, so set "Category" or use a category URL. Empty means any condition.

## `sellerType` (type: `string`):

Private sellers only, business sellers only (lojas e profissionais), or both. Private-only is applied by OLX; business-only is applied here, because OLX's own filter cannot express it.

## `onlyGoodSellers` (type: `boolean`):

Keep only sellers OLX rates above four stars. Applied at the source, and like "Condition" it needs a category to take effect. Narrows results hard: about one listing in nine survives it.

## `publishedWithinDays` (type: `integer`):

Keep only listings published in the last N days. 0 means any age. Measured from OLX's own publication timestamp, not the bump that moves an old ad back to the top.

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

Which listings OLX serves first. Relevance, newest and lowest price are applied by OLX. OLX has no highest-price order in its URLs, so that one is applied to the listings collected instead, and only on runs capped at 10,000 or fewer.

## `splitLargeSearches` (type: `boolean`):

On by default. OLX serves at most 5,000 listings for any one search, however hard you page. When a search has more matches than that and you asked for more than 5,000 results, the Actor cuts it into narrower price bands, and then into states, until every slice fits under the limit. Turn off to stay inside a single search.

## `enrichDetails` (type: `boolean`):

Off by default. Opens each listing to add the full description, the CEP postal code, the seller's name and account ID, whether the account is a verified business, its completed and cancelled sale counts and average dispatch time, and whether a phone number is on file. A listing page costs about 190 times the bandwidth of a search result, so it is charged separately as "listing-enriched" and only for listings you actually receive.

## `maxResults` (type: `integer`):

Listings returned by the run. The default keeps a first run cheap and quick; set 0 for unlimited, there is no hard ceiling. Anything above 5,000 needs "Go past OLX's 5,000-listing limit" left on.

## Actor input object example

```json
{
  "searchQueries": [
    "iphone 13",
    "honda civic"
  ],
  "searchUrls": [
    "https://www.olx.com.br/imoveis/venda/estado-sp",
    "https://www.olx.com.br/autos-e-pecas/carros-vans-e-utilitarios/estado-rj?ps=30000&pe=60000"
  ],
  "category": "celulares",
  "state": "SP",
  "listingUrls": [
    "https://sp.olx.com.br/sao-paulo-e-regiao/celulares/apple-iphone-11-128gb-branco-1508941438"
  ],
  "minPrice": 1000,
  "maxPrice": 3000,
  "condition": [
    "New",
    "Used - excellent"
  ],
  "sellerType": "any",
  "onlyGoodSellers": false,
  "publishedWithinDays": 7,
  "sortBy": "relevance",
  "splitLargeSearches": true,
  "enrichDetails": false,
  "maxResults": 20
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `sellers` (type: `string`):

No description

## `pricing` (type: `string`):

No description

## `locations` (type: `string`):

No description

## `descriptions` (type: `string`):

No description

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

No description

# 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 = {
    "searchQueries": [
        "iphone 13"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdata_labs/olx-brazil-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 = {
    "searchQueries": ["iphone 13"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("webdata_labs/olx-brazil-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 '{
  "searchQueries": [
    "iphone 13"
  ],
  "maxResults": 20
}' |
apify call webdata_labs/olx-brazil-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,webdata_labs/olx-brazil-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/adQttwt76aDJJnEPN/builds/3ilGDxScUeHsynafN/openapi.json
