# Tatui Imoveis Scraper - Property Ads, Agencies & Articles (`recordsdata/tatuiimoveis-scraper`) Actor

Scrape tatuiimoveis.com, a regional real estate directory for Tatui and nearby towns in Sao Paulo, Brazil: property ads with BRL prices and areas, the agency directory with CRECI and addresses, articles with full text, and town price statistics. No login, no proxy.

- **URL**: https://apify.com/recordsdata/tatuiimoveis-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $18.00 / 1,000 property ads

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

![RecordsData](https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3)

## 🏡 Tatui Imoveis Scraper - Brazil Property Ads, Real Estate Agencies and Articles - RecordsData

> 🚀 **Export the whole tatuiimoveis.com site in under a minute.** Property ads with prices in BRL, areas, rooms and addresses, a directory of 335 real estate agencies of Tatuí and nearby towns with CRECI numbers, 500 articles with full text and one statistics row per town. No login, no browser, no proxy.

**Tatui Imoveis Scraper is an Apify Actor that collects the public data of tatuiimoveis.com, a small regional real estate portal for Tatuí, Sorocaba, Itapetininga, Boituva and about 25 other towns in the state of São Paulo, Brazil.** It returns typed rows in four record types: `listing` (a property ad), `agency` (an entry of the agency directory), `article` (an editorial post with its cleaned text) and `place` (price and supply statistics for one town). Prices are in Brazilian reais (`currency: BRL`), text is in Brazilian Portuguese (`language: pt-BR`), and every row carries the country, source site, URL and publication date.

**Quick answer:** the whole site holds about 950 rows, so a complete run of every record type finishes in about 45 seconds with 26 requests and costs about $20.12 at the live pay-per-event prices (listing $0.018, agency $0.027, article $0.018, town row $0.018). Free plans return up to 10 items per run. Results export as JSON, CSV, Excel, XML or HTML, or through the Apify API.

**Be clear about what this is.** tatuiimoveis.com is not a classifieds giant like ZAP or OLX. It is a regional WordPress blog that ran a property section from 2012 to 2022 and now publishes mostly finance and benefit articles. The data is small, regional and mostly archival: about 68 property ads (2013 to 2022), 335 agency entries (2012 to 2018) and 518 articles (2013 to 2026). If you need live inventory for all of Brazil, use a portal scraper. If you need a clean, structured copy of what this site holds, this Actor does that.

| 🎯 Audience | 💡 Use cases |
|---|---|
| Regional real estate analysts | Historical asking prices of houses, land and farms |
| Sales teams | 335 agencies and brokers with town, CRECI licence and website |
| Researchers, journalists | Price levels per town and year, agency density |
| Content and SEO teams | 518 Portuguese articles on credit, finance and property |
| Data and AI builders | A small clean pt-BR real estate dataset for tests |

### 📋 What the Tatui Imoveis Scraper does

The Actor reads the public WordPress REST API that the site itself exposes to every visitor. Posts come in pages of up to 100, are sorted by what they really are (ad, agency entry, article or list of tradespeople) and are parsed from their Portuguese text into typed fields. A list of tradespeople (masons, painters, electricians) is skipped because it is not real estate.

- **listings**: one row per property ad. Operation (sale, rent or donation), property type (house, apartment, land, farm, commercial), price and price text, price per square metre, maintenance fee and IPTU when stated, address, neighbourhood, condominium, town, bedrooms, suites, bathrooms, parking spaces, built area, land area, frontage and depth, amenities in Portuguese, the description, photos and the publication date.
- **agencies**: one row per agency or broker of the directory. Name, type (agency or broker), CRECI numbers, street, neighbourhood, town, CEP, services (sale, rent, rural), website and photos.
- **articles**: one row per editorial post with category, tags, summary, the full cleaned text, headings, keywords, word count, reading time and link counts.
- **places**: one row per town with ad counts, agency counts, how many agencies have a website or a CRECI, property type mix, top neighbourhoods, price minimum, median, average and maximum, median price per square metre for buildings and for land, the median rent and the first and last ad dates.

### 📊 Output

Every row has a `recordType` (`listing`, `agency`, `article` or `place`). Fields without a value are left out, never filled with `null`. The column order is fixed: image first, then identity, location, price, features, text, dates and advertiser. The dataset has 99 columns in total, and a listing row uses about 50 of them.

| Field | Type | Example |
|---|---|---|
| `recordType`, `listingId`, `url`, `title` | string | `listing`, `3489` |
| `country`, `language`, `currency` | string | `BR`, `pt-BR`, `BRL` |
| `operation`, `propertyType`, `propertySubtype` | string | `sale`, `house`, `Casa` |
| `price`, `priceText`, `pricePerM2` | number, string | `1170000`, `R$ 1.170.000,000` |
| `city`, `region`, `neighborhood`, `postalCode` | string | `Sorocaba`, `SP` |
| `bedrooms`, `suites`, `bathrooms`, `parkingSpaces` | number | `3`, `1`, `1`, `4` |
| `areaBuilt`, `areaLand`, `areaTotal` | number (m²) | `411`, `345` |
| `amenities`, `images` | array | `["piscina", "sauna"]` |
| `agencyName`, `creci`, `services`, `website` | string, array | agency rows |
| `category`, `text`, `headings`, `wordCount` | string, array, number | article rows |
| `listingCount`, `priceMedian`, `agencyCount` | number | place rows |
| `publishedAt`, `publishedYear` | ISO date, number | `2016-09-21T20:32:08.000Z` |

Sample listing from a real run (long text and lists shortened):

```json
{
  "imageUrl": "https://tatuiimoveis.com/wp-content/uploads/2016/09/casa-ibiti-do-paco-sorocaba-venda.jpg",
  "recordType": "listing",
  "title": "Casa em Sorocaba à Venda (Condomínio Ibiti do Paço)",
  "listingId": "3489",
  "url": "https://tatuiimoveis.com/casa-em-sorocaba-venda-condominio-ibiti-do-paco/",
  "country": "BR",
  "language": "pt-BR",
  "operation": "sale",
  "propertyType": "house",
  "price": 1170000,
  "priceUnit": "total",
  "currency": "BRL",
  "priceText": "R$ 1.170.000,000",
  "pricePerM2": 2846.72,
  "city": "Sorocaba",
  "region": "SP",
  "condominiumName": "Condomínio Ibiti do Paço",
  "bedrooms": 3,
  "suites": 1,
  "bathrooms": 1,
  "parkingSpaces": 4,
  "areaBuilt": 411,
  "areaLand": 345,
  "amenities": ["piscina", "área gourmet", "sauna", "..."],
  "publishedAt": "2016-09-21T20:32:08.000Z",
  "isPrivateSeller": true,
  "advertiserType": "private"
}
```

### ✨ Why choose this Actor

- **Structured from free text.** "345 m² de terreno e 411 m² de Área construída" becomes `areaLand: 345` and `areaBuilt: 411`, and the typo "R$ 1.170.000,000" becomes `1170000`.
- **Fast and light.** It uses the site's own API: no browser, no proxy, 45 seconds for all rows.
- **Private sellers stay private.** Names and phones in the ad text are never output and the contact lines are removed.
- **Monitor mode.** Schedule it with `onlyNew` to receive only posts you have not received before.

### 📈 How it compares to alternatives

No Apify Actor reads tatuiimoveis.com. The closest options are the Brazilian portal scrapers below, read on 2026-10-11.

| | This Actor | fatihtahta ZAP Imoveis | haketa ZAP Imoveis |
|---|---|---|---|
| Site | tatuiimoveis.com archive | ZAP Imoveis live ads | ZAP, switch to VivaReal |
| Record types | Ads, agencies, articles, town stats | Ads with seller details | Ads and agency directory |
| Coordinates | Not on the site | Shown on its page | Shown on its page |
| Seller phones | Never for private sellers | Public phones, per its page | Agency contacts only |
| Price per 1,000 | $18.00 ads, $27.00 agencies | $1.99 | From $3.00 |

The ZAP actors cover far more live ads and give coordinates, which this site cannot. This Actor is the only one for this regional archive, adds its agency directory with CRECI numbers, articles and town statistics. At $18.00 per 1,000 ads it is priced well above both ZAP actors; the extra cost buys the only structured source for this archive, not a lower cost per ad. Choose a ZAP actor for live Brazil-wide inventory, and this one for a clean copy of this site.

### 🔍 Input parameters

| Parameter | What it does |
|---|---|
| `recordTypes` | `listings`, `agencies`, `articles`, `places`, any mix (default listings and agencies) |
| `maxItems` | Row cap, free plans 10 |
| `cities`, `operation`, `propertyTypes` | Towns, sale or rent, house, apartment, land, farm, commercial |
| `minPrice`, `maxPrice`, `minBedrooms`, `minArea` | Limits in BRL and m² |
| `keyword`, `postedAfter`, `postedBefore` | Text search and date window |
| `agencyServices`, `onlyWithWebsite`, `articleCategories` | Directory and article filters |
| `sortBy` | `newest`, `oldest`, `price-asc`, `price-desc`, `name` |
| `startUrls`, `postIds` | Single posts by address or number |
| `onlyNew`, `stateKey`, `resetSeen` | Monitor mode controls |
| `includeContactDetails`, `includeFullText`, `includeRaw` | Business contacts, article text, raw payload |

Example input:

```json
{
  "recordTypes": ["listings"],
  "cities": ["Sorocaba"],
  "operation": "sale",
  "minPrice": 500000,
  "sortBy": "price-desc",
  "maxItems": 20
}
```

### 💰 Pricing and cost examples

Pay per event, read from the live Actor on 2026-10-11. You pay only for rows delivered.

| Event | Price | Per 1,000 |
|---|---|---|
| Property ad | $0.018 | $18.00 |
| Agency entry | $0.027 | $27.00 |
| Article | $0.018 | $18.00 |
| Town statistics row | $0.018 | $18.00 |

- All 68 property ads: 68 x $0.018 = **$1.22**.
- The whole agency directory, 335 entries: 335 x $0.027 = **$9.05**.
- Everything on the site, about 950 rows: **about $20.12**.
- A weekly monitor finding 3 new posts: **about $0.05** per run.

Free plans return up to 10 items per run. Rows skipped by Only new records are not charged.

### 🚀 How to use

1. Open the Actor in Apify Console and pick **What to collect**: property ads, the agency directory, articles, town statistics, or any mix.
2. Optionally narrow the search: towns, sale or rent, property types, price range, bedrooms, minimum area, a keyword, a date window, agency services, or article categories.
3. Set **Maximum items** and press Start. Download the dataset as JSON, CSV or Excel, or read it through the API.

Typical starting points: all ads in Sorocaba for sale above R$ 500,000; the agencies of Tietê with a website; the most expensive ads of the site; a weekly feed of new posts with Only new records.

Search by keyword (for example `chacara`) or publication date. Schedule runs in Apify Console and send results to Make, Zapier, n8n, Google Sheets or Slack. The Apify API, the Python and JavaScript apify-client packages and curl start runs and read datasets.

### ⚖️ Limits and legal

The data is small and mostly archival. The last property ad is from 2022 and the last agency entry from 2018, so this is not a live market feed. The site gives no coordinates. Some ads have no price or area in their text, and those fields are left out. Update dates and post authors are not output. Only public data is read, through the public API of the site, at most one request every 300 milliseconds. The terms of use of the site are your responsibility, as is data protection law such as the LGPD or the GDPR.

### 🤖 Use it with AI agents (MCP)

Connect Apify to Claude, ChatGPT or any MCP client through the Apify MCP server, add this Actor, and the agent can call it as a tool.

**Example agent prompt:** "Use the Tatui Imoveis Scraper to list the five most expensive houses for sale in Sorocaba, with price in BRL, built area and neighbourhood."

**Tool description (what the agent sees):** Scrape the public data of tatuiimoveis.com, a regional real estate site for Tatuí and nearby towns in São Paulo, Brazil. Input: recordTypes (listings, agencies, articles, places), optional filters (cities, operation, propertyTypes, price range, minBedrooms, minArea, keyword, dates) and maxItems. Output: typed rows in the dataset, with prices in BRL and text in Portuguese.

### Frequently Asked Questions

#### 🏠 What data can I scrape from tatuiimoveis.com?

You can scrape four record types: property ads with BRL prices, areas, rooms and address; the agency directory with CRECI numbers, services and website; articles with category, tags, headings and full cleaned text; and one statistics row per town with price medians and agency counts. The site holds no coordinates and no seller accounts, so none are output.

#### 🔢 How many rows does the site hold?

The site holds about 68 property ads, 335 agency entries, 518 articles and 29 town statistics rows, so roughly 950 rows in total. If you set a higher maximum than that, the run simply ends when the site is exhausted. You are charged only for the rows actually delivered, never for the unused part of the maximum.

#### 📅 Are the ads current?

No. The ads were published between 2013 and 2022 and the site neither removes them nor marks them as sold. Treat every price as a historical asking price and check `publishedYear` before you use it. The newest agency entry is from 2018. If you need live Brazilian inventory, a scraper for a large portal such as ZAP Imoveis is the better fit.

#### 🔒 Does it output phone numbers or names of sellers?

Never for private sellers, whose names and phones are removed from the description too. Agencies and brokers have business phones and emails, which are off by default and appear only with the option Include business contacts, as E.164 phone numbers. Turn it on only if you have a lawful reason to process contact data under the LGPD or the GDPR.

#### 💰 Why is the price of a land ad so large?

Some ads quote a price per square metre, for example "R$35,00 o metro quadrado" for 70,000 m². The Actor keeps the quote in `priceText` and `pricePerM2` and sets `price` to the rate times the area, which is 2,450,000. Check `priceUnit` and `priceText` when a land price looks too high, and use `pricePerM2` for comparisons.

#### 🔁 How do I get only new posts?

Turn on Only new records and run the same search again later, for example on a weekly schedule. The Actor remembers what it delivered and skips it, and skipped rows are not charged. Use Monitor name to keep several monitors apart, and Forget what was delivered to start over.

#### ⏱️ How fast is it?

A 3-row run takes a few seconds. A complete run of all record types is about 26 requests and 45 seconds, because the Actor never starts more than one request every 300 milliseconds by default. It reads the public API of the site, so no browser is needed and memory use stays low.

#### 🆓 What do free plans get?

Free plans return up to 10 items per run, which is enough to test the fields and the export formats. Paid plans can raise the maximum items up to the size of the site, about 950 rows. A full export of every record type costs about $20.12 at the live prices, so start with a small maximum to test.

#### 🌐 Do I need a proxy?

No. The site answers plain requests from Apify servers, so the default run uses no proxy and no login. A proxy option exists only as a fallback if the site ever blocks datacenter addresses, and it is off by default. You do not need an API key of the site, since the data comes from its public WordPress API.

#### ⚖️ Is it legal to scrape tatuiimoveis.com?

The Actor collects only public data that the site serves to every visitor, respects its robots.txt, leaves out private persons and keeps contact data off by default. Whether your use is lawful depends on you: the terms of the site and data protection law such as the LGPD and the GDPR are your responsibility. This is not legal advice.

### 🔗 Recommended Actors

- [RecordsData collection](https://apify.com/RecordsData): other real estate and public data scrapers by the same team.

**🆘 Need help?** Write to <contact.punkrecordsdata@gmail.com> or open an issue in the Issues tab.

> **⚠️ Disclaimer:** This is an independent tool and is not affiliated with, endorsed by or sponsored by tatuiimoveis.com. All trademarks belong to their owners. It collects only publicly available data.

Last updated: 2026-10-11

# Actor input Schema

## `recordTypes` (type: `array`):

listings = property ads (houses, land, farms, shops) with price in BRL, areas, rooms and address. agencies = the directory of real estate agencies and brokers of Tatui and the region (name, CRECI, address, services, website). articles = the editorial posts of the site (property, credit and finance guides) with full text. places = one statistics row per town (ad counts, price median, agencies). Posts and addresses you give below are delivered whatever their kind.

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

Stops after this many rows (all record types together). Free plans are limited to 10 items per run. The whole site has about 950 rows.

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

tatuiimoveis.com post pages (for example /casa-venda-tatui-jardim-wanderley/), category pages (/category/artigos/), tag pages (/tag/sorocaba/) and search pages (/?s=chacara). Filters below apply to category, tag and search pages, not to single posts. Leave empty to scan the whole site by the record types above.

## `postIds` (type: `array`):

Single posts by their WordPress number (the listingId, agencyId or articleId of a row), one per line, for example 3489. Unknown numbers produce a free error row.

## `cities` (type: `array`):

Only listings, agencies and places in these towns, one per line, for example Tatui, Sorocaba, Itapetininga, Boituva. Accents and capitals do not matter. Empty means all towns.

## `operation` (type: `string`):

Listings only. Sale, rent, or both. Free donations of land are kept only when this is Any.

## `propertyTypes` (type: `array`):

Listings only. Empty means all types.

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

Listings only, in Brazilian reais. For sale ads this is the sale price, for rent ads the monthly rent. Ads without a price are left out when a price filter is set. 0 means no limit.

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

Listings only, in Brazilian reais. 0 means no limit.

## `minBedrooms` (type: `integer`):

Listings only. Ads that do not state the bedrooms are left out when this is set. 0 means no limit.

## `minArea` (type: `integer`):

Listings only. Compared with the largest of built area, land area and total area. 0 means no limit.

## `keyword` (type: `string`):

Every word must start a word in the title, text, address or neighbourhood (for example ibiti, chacara, financiamento). Accents and capitals do not matter.

## `postedAfter` (type: `string`):

Publication date of the post, format YYYY-MM-DD, for example 2016-01-01.

## `postedBefore` (type: `string`):

Publication date of the post, format YYYY-MM-DD, for example 2018-12-31.

## `agencyServices` (type: `array`):

Agencies only. Keep agencies that list at least one of these services. Empty means all.

## `onlyWithWebsite` (type: `boolean`):

Agencies only. Keeps entries that publish a web address.

## `articleCategories` (type: `array`):

Articles only. Keep posts of these categories. Empty means all.

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

Newest and oldest stop reading as soon as the limit is reached. The price and name orders read the whole directory first (about 10 requests) and then deliver the top rows. Price orders apply to listings; agencies and articles then follow name or newest order.

## `includeContactDetails` (type: `boolean`):

Adds the business phone (E.164) and email of agencies and, for ads published by an agency or broker, the broker name, CRECI licence and phone. Private sellers are never included, whatever this setting. Turn on only if you have a lawful reason to process contact data.

## `includeFullText` (type: `boolean`):

Articles only. On: the full cleaned text of the article. Off: summary, headings and counts only (smaller rows).

## `includeRaw` (type: `boolean`):

Adds a raw field with the unmapped source data of the post (WordPress ids, source lines). Seller contact lines are never included.

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

Skips records delivered by an earlier run of the same search (listings, agencies and articles). Nothing skipped is charged.

## `stateKey` (type: `string`):

Optional label to keep several monitors with identical settings apart.

## `resetSeen` (type: `boolean`):

Clears the memory of this search before the run, so everything counts as new.

## `requestDelayMs` (type: `integer`):

Minimum time between two requests to the site. The robots.txt of the site has no Crawl-delay; the Actor never goes below 300 ms, whatever is set here.

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

Optional. Leave proxy off (the default): the site works without one. Turn it on only if requests start failing.

## Actor input object example

```json
{
  "recordTypes": [
    "listings"
  ],
  "maxItems": 10,
  "startUrls": [],
  "postIds": [],
  "cities": [],
  "operation": "any",
  "propertyTypes": [],
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "minArea": 0,
  "keyword": "",
  "postedAfter": "",
  "postedBefore": "",
  "agencyServices": [],
  "onlyWithWebsite": false,
  "articleCategories": [],
  "sortBy": "newest",
  "includeContactDetails": false,
  "includeFullText": true,
  "includeRaw": false,
  "onlyNew": false,
  "stateKey": "",
  "resetSeen": false,
  "requestDelayMs": 300,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields per row

## `fullData` (type: `string`):

Complete dataset with all fields

# 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 = {
    "recordTypes": [
        "listings"
    ],
    "maxItems": 10,
    "startUrls": [],
    "postIds": [],
    "cities": [],
    "propertyTypes": [],
    "agencyServices": [],
    "articleCategories": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/tatuiimoveis-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 = {
    "recordTypes": ["listings"],
    "maxItems": 10,
    "startUrls": [],
    "postIds": [],
    "cities": [],
    "propertyTypes": [],
    "agencyServices": [],
    "articleCategories": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/tatuiimoveis-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 '{
  "recordTypes": [
    "listings"
  ],
  "maxItems": 10,
  "startUrls": [],
  "postIds": [],
  "cities": [],
  "propertyTypes": [],
  "agencyServices": [],
  "articleCategories": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call recordsdata/tatuiimoveis-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/tatuiimoveis-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/UkIfA1K230IDHGgby/builds/Vb8NoQnZx5E50mFma/openapi.json
