# AppFolio Scraper: Rental Listings and Property Manager Data (`getascraper/appfolio-scraper`) Actor

Extract public AppFolio rental listings from authorized tenant listing URLs with normalized rent, beds, baths, availability, address, coordinates, photos, application links, and optional detail-page contacts.

- **URL**: https://apify.com/getascraper/appfolio-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.66 / 1,000 rental listings

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

## 🏠 AppFolio Scraper: rental listings and property manager data

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:24px 28px;background:#EFF6FF;border:1px solid #BFDBFE;border-top:4px solid #1D4ED8;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Turn public AppFolio listings into a ready-to-use rental inventory</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Bring live listing pages into one consistent dataset with rent, room, location, pet, size, keyword, photo, and optional public property-manager filters.</span>
</td>
</tr>
</table>

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #BFDBFE;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1E3A8A">🏠 Current listings</span><br>
<span style="font-size:12px;color:#57534E">See rent and availability as published.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #BFDBFE;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1E3A8A">📍 Location-ready</span><br>
<span style="font-size:12px;color:#57534E">Use addresses and map coordinates for research.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #BFDBFE;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1E3A8A">📸 Media and actions</span><br>
<span style="font-size:12px;color:#57534E">Keep photos, applications, showings, and links together.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #BFDBFE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1E3A8A">☎️ Public contacts</span><br>
<span style="font-size:12px;color:#57534E">Add office and phone details from enriched pages.</span>
</td>
</tr>
</table>

Need a repeatable view of rental supply without copying listing details by hand? AppFolio Scraper turns authorized public listing pages into clean records for housing research, vacancy monitoring, lead workflows, and scheduled snapshots.

### ✨ Why use it?

- Property managers can review current rental supply across several public listing pages in one dataset.
- Housing researchers can compare rent, availability, property facts, addresses, and coordinates in a consistent shape.
- Leasing teams can narrow results by rent, bedrooms, bathrooms, size, city, postal code, move-in date, pet policy, keywords, and application links.
- Lead teams can keep public application, showing, contact, office, and phone details beside each listing when the source publishes them.
- Operations teams can run the same source list again when they need a fresh snapshot.

### ⚠️ Use and source terms

Use this Actor only with AppFolio listing sources and data you are authorized to access. Public availability does not override source terms. Review the [AppFolio listing terms](https://www.appfolio.com/terms/listings), each source's access instructions, and your local requirements before running it.

The Actor does not require a login and does not access private customer accounts. It only returns information published on the supplied listing pages. Source availability and terms can change, so you are responsible for deciding whether a run is permitted.

### 🧭 How it works

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#EFF6FF;border:1px solid #BFDBFE;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#1D4ED8;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Add listing pages</span><br>
<span style="font-size:12px;color:#57534E">Provide one or more public AppFolio listing or detail URLs.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EFF6FF;border:1px solid #BFDBFE;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#1D4ED8;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Set your target</span><br>
<span style="font-size:12px;color:#57534E">Combine source filters with size, keyword, and application-link filters.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EFF6FF;border:1px solid #BFDBFE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#1D4ED8;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Use the dataset</span><br>
<span style="font-size:12px;color:#57534E">Download structured listing records for research, workflows, or monitoring.</span>
</td>
</tr>
</table>

Detail enrichment is optional. Turn it on when you need descriptions, amenities, pet policy, public office details, or phone fields from listing pages that publish them.

### 💰 Pricing

Pay per successful result. Empty runs cost nothing, and there are no subscriptions. When detail enrichment is enabled, each enriched result also includes a separate detail-enrichment charge because it requires an additional source page. The default run is intentionally bounded at 25 listings, with higher limits available through the input form.

### ⭐ Enjoying AppFolio Scraper?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:20px 24px 14px;background:#EFF6FF;border:1px solid #BFDBFE;border-left:5px solid #1D4ED8;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px;color:#1C1917">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">A short review helps rental teams find a cleaner path from listing pages to usable property data.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other property managers, researchers, and lead teams find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#1D4ED8;border:1px solid #BFDBFE;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/appfolio-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### 📥 Input

| Field                   | Type             | Required | Description                                                                                                                            |
| ----------------------- | ---------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`             | array of URLs    | No       | Public HTTPS AppFolio listing or detail URLs you are authorized to access. The form includes a sample source by default.               |
| `minRent`               | integer          | No       | Keep listings at or above this published rent. Leave empty to include every rent level.                                                |
| `maxRent`               | integer          | No       | Keep listings at or below this published rent. Leave empty to include every rent level.                                                |
| `minBedrooms`           | integer          | No       | Keep listings with at least this many bedrooms. Studios count as zero bedrooms.                                                        |
| `maxBedrooms`           | integer          | No       | Keep listings with no more than this many bedrooms. Combine it with `minBedrooms` for a range.                                         |
| `minBathrooms`          | integer          | No       | Keep listings with at least this many bathrooms.                                                                                       |
| `maxBathrooms`          | integer          | No       | Keep listings with no more than this many bathrooms. Combine it with `minBathrooms` for a range.                                       |
| `cities`                | array of strings | No       | Keep listings in these exact published city names. Add one city per row.                                                               |
| `postalCodes`           | array of strings | No       | Keep listings in these published postal codes. Add one code per row.                                                                   |
| `catPolicy`             | enum             | No       | Choose `Any`, `Cats allowed`, or `Cats not allowed`. Defaults to `Any`.                                                                |
| `dogPolicy`             | enum             | No       | Choose `Any`, `Dogs allowed`, `Small dogs allowed`, or `Dogs not allowed`. Defaults to `Any`.                                          |
| `desiredMoveIn`         | string           | No       | Pass a desired move-in date to the source filter. Leave empty when the date does not matter.                                           |
| `sortBy`                | enum             | No       | Choose the source order: most recent, rent low to high, rent high to low, or bedrooms. Defaults to most recent.                        |
| `minSqft`               | integer          | No       | Keep listings with published square footage at or above this value.                                                                    |
| `maxSqft`               | integer          | No       | Keep listings with published square footage at or below this value.                                                                    |
| `includeKeywords`       | array of strings | No       | Keep listings whose published text, amenities, appliances, or pet policy contains at least one term.                                   |
| `excludeKeywords`       | array of strings | No       | Remove listings whose published text, amenities, appliances, or pet policy contains any term.                                          |
| `requireApplicationUrl` | boolean          | No       | Keep only listings that publish a public application link. Defaults to `false`.                                                        |
| `scrapeDetails`         | boolean          | No       | Fetch optional description, amenities, pet policy, public office, phone, and action fields from each detail page. Defaults to `false`. |
| `maxItems`              | integer          | No       | Maximum matching unique listings across all sources. Defaults to `25` and accepts values from `1` to `500`.                            |
| `maxPages`              | integer          | No       | Maximum listing pages to read from each source while looking for matches. Defaults to `10` and accepts values from `1` to `25`.        |
| `requestDelayMs`        | integer          | No       | Minimum wait between requests to the same source. Defaults to `10000` milliseconds and accepts values from `10000` to `60000`.         |

The Actor respects the source's published access instructions and uses a minimum delay between requests. Free-plan runs are limited to 25 listings, 3 runs per rolling 24 hours, and a 30-minute wait between runs.

### 📊 Data table

| Field             | Type   | Description                                                                           |
| ----------------- | ------ | ------------------------------------------------------------------------------------- |
| `platform`        | string | Source platform identifier, set to `appfolio`.                                        |
| `id`              | string | Stable tenant and listing identifier.                                                 |
| `listingId`       | string | Listing identifier from the detail page.                                              |
| `tenant`          | string | AppFolio tenant hostname.                                                             |
| `url`             | string | Public listing detail URL.                                                            |
| `sourceUrl`       | string | Listing page used to discover the record.                                             |
| `sourceListingId` | string | Listing card or map identifier when published by the source.                          |
| `title`           | string | Published listing title.                                                              |
| `description`     | string | Detail-page description when `scrapeDetails` is enabled and the source publishes one. |
| `address`         | string | Full published address.                                                               |
| `street`          | string | Parsed street address.                                                                |
| `city`            | string | Parsed city.                                                                          |
| `state`           | string | Parsed state or region.                                                               |
| `zip`             | string | Parsed postal code.                                                                   |
| `latitude`        | number | Published map latitude.                                                               |
| `longitude`       | number | Published map longitude.                                                              |
| `rent`            | number | Single published rent value when available.                                           |
| `rentMin`         | number | Lower value of a published rent range.                                                |
| `rentMax`         | number | Upper value of a published rent range.                                                |
| `rentFormatted`   | string | Original published rent text.                                                         |
| `currency`        | string | Currency inferred from the published rent symbol.                                     |
| `beds`            | number | Published bedroom count.                                                              |
| `baths`           | number | Published bathroom count.                                                             |
| `sqft`            | number | Published square-footage value.                                                       |
| `available`       | string | Published availability text.                                                          |
| `amenities`       | array  | Published amenity labels from an enriched detail page.                                |
| `utilities`       | string | Published utilities information from an enriched detail page.                         |
| `appliances`      | array  | Published appliance labels from an enriched detail page.                              |
| `petPolicy`       | array  | Published pet-policy labels from an enriched detail page.                             |
| `image`           | string | Primary published photo URL.                                                          |
| `images`          | array  | Published photo URLs from the listing.                                                |
| `applyUrl`        | string | Public application URL when published.                                                |
| `showingUrl`      | string | Public showing-scheduling URL when published.                                         |
| `contactUrl`      | string | Public contact URL when published.                                                    |
| `officeName`      | string | Public property-management office name from an enriched detail page.                  |
| `phone`           | string | Public property-management phone number from an enriched detail page.                 |
| `scrapedAt`       | string | ISO timestamp for the extracted record.                                               |

### 🧾 Example record

This enriched example comes from a public AppFolio listing. Optional fields that the source does not publish are omitted.

```json
{
    "platform": "appfolio",
    "id": "apg.appfolio.com:afef0c1a-9a36-48a5-9bae-de6400f67d37",
    "tenant": "apg.appfolio.com",
    "scrapedAt": "2026-09-20T05:23:57.260Z",
    "listingId": "afef0c1a-9a36-48a5-9bae-de6400f67d37",
    "url": "https://apg.appfolio.com/listings/detail/afef0c1a-9a36-48a5-9bae-de6400f67d37",
    "sourceUrl": "https://apg.appfolio.com/listings",
    "sourceListingId": "243",
    "title": "Beautiful New Studio Close to Twitter",
    "description": "Living at 1335 Folsom puts you in the middle of everything San Francisco has to offer. From theaters and museums to trendy breweries and farmers markets, weekly entertainment is all within walking distance.",
    "address": "1335 Folsom St, Unit 306, San Francisco, CA 94103",
    "street": "1335 Folsom St, Unit 306",
    "city": "San Francisco",
    "state": "CA",
    "zip": "94103",
    "latitude": 37.773184,
    "longitude": -122.411916,
    "rent": 3005,
    "rentFormatted": "$3,005",
    "currency": "USD",
    "beds": 0,
    "baths": 1,
    "sqft": 402,
    "available": "9/28/26",
    "amenities": ["Balcony", "Roof Deck with BBQs", "Community Room"],
    "utilities": "Tenant pays all utilities",
    "appliances": ["Refrigerator", "Stove/Oven", "Microwave", "Dishwasher"],
    "petPolicy": ["Cats allowed", "Small dogs allowed"],
    "image": "https://images.cdn.appfolio.com/apg/images/f81048aa-6d3a-48ed-b161-5bc2a518ce8b/large.jpg",
    "images": [
        "https://images.cdn.appfolio.com/apg/images/f81048aa-6d3a-48ed-b161-5bc2a518ce8b/large.jpg",
        "https://images.cdn.appfolio.com/apg/images/8425c189-a1ae-4891-a68d-c03684c14ecf/large.jpg",
        "https://images.cdn.appfolio.com/apg/images/7de08553-4e9f-45f1-b497-4f8c8e6fa65c/large.jpg"
    ],
    "applyUrl": "https://apg.appfolio.com/listings/rental_applications/new?listable_uid=afef0c1a-9a36-48a5-9bae-de6400f67d37&source=Website",
    "showingUrl": "https://apg.appfolio.com/listings/showings/new?listable_uid=afef0c1a-9a36-48a5-9bae-de6400f67d37&source=Website",
    "contactUrl": "https://apg.appfolio.com/listings/detail/afef0c1a-9a36-48a5-9bae-de6400f67d37/contact_us_form",
    "officeName": "ATLAS PROPERTY GROUP",
    "phone": "(415) 216-4945"
}
```

Missing source fields are omitted rather than replaced with placeholders.

### ❓ FAQ

##### Does it need a login?

No. It reads public AppFolio listing pages and does not access private customer accounts. Only provide sources and data you are authorized to access.

##### How fresh is the data?

Each run reads the supplied live listing pages. Rent, availability, photos, and contact details reflect what the source publishes at run time.

##### Can it extract private phone numbers?

No. Phone and office fields are returned only when the public detail page publishes them and `scrapeDetails` is enabled. The Actor does not open private contact walls or sign-in areas.

##### Which sources are supported?

Use public HTTPS AppFolio tenant pages under `*.appfolio.com/listings`, including listing pages with filters and public detail URLs. Other websites are rejected so the output stays within the Actor's supported source scope.

### 🔗 Other actors

- [Lianjia Source Monitor](https://apify.com/getascraper/lianjia-real-estate-scraper) ↗: Track public property source pages for housing research.
- [Landflip Scraper: US Land Listings & Broker Leads](https://apify.com/getascraper/landflip-scraper) ↗: Collect land listings and broker lead fields.
- [🌾 LandAndFarm scraper: US land listings and broker leads](https://apify.com/getascraper/landandfarm-scraper) ↗: Export public land listings and related contacts.
- [🏘️ Etagi Real Estate Scraper: Парсер Этажи](https://apify.com/getascraper/etagi-property-scraper) ↗: Gather property listings and real-estate details.
- [CommercialRealEstate.com.au scraper: prices, agents, and deal status ready for your spreadsheet](https://apify.com/getascraper/commercialrealestate-au-scraper) ↗: Build structured commercial property research datasets.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/appfolio-scraper/changelog.md

# Actor input Schema

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

Public HTTPS AppFolio listing pages or detail pages you are authorized to access. Use a tenant URL such as https://example.appfolio.com/listings.

## `minRent` (type: `integer`):

Return listings with published rent at or above this amount. Leave empty to keep all rent levels.

## `maxRent` (type: `integer`):

Return listings with published rent at or below this amount. Leave empty to keep all rent levels.

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

Return listings with at least this many bedrooms. Studios are represented as zero bedrooms.

## `maxBedrooms` (type: `integer`):

Return listings with no more than this many bedrooms. Use this with Minimum Bedrooms for an exact bedroom range.

## `minBathrooms` (type: `integer`):

Return listings with at least this many bathrooms.

## `maxBathrooms` (type: `integer`):

Return listings with no more than this many bathrooms. Use this with Minimum Bathrooms for an exact bathroom range.

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

Keep listings in these exact published city names. Add one city per row and leave empty to include every city.

## `postalCodes` (type: `array`):

Keep listings in these published postal codes. Add one code per row and leave empty to include every postal code.

## `catPolicy` (type: `string`):

Filter by whether the public listing identifies cats as allowed. Any keeps the source default.

## `dogPolicy` (type: `string`):

Filter by whether the public listing identifies dogs as allowed. Small keeps listings that mention small dogs.

## `desiredMoveIn` (type: `string`):

Pass a desired move-in date to the source listing filter. Leave empty when the move-in date does not matter.

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

Choose the order used by the source before records are returned.

## `minSqft` (type: `integer`):

Return listings with published square footage at or above this value. Leave empty when size does not matter.

## `maxSqft` (type: `integer`):

Return listings with published square footage at or below this value. Use this with Minimum Square Feet for an exact size range.

## `includeKeywords` (type: `array`):

Keep listings whose published text, amenities, appliances, or pet policy contains at least one of these terms. Add one term per row.

## `excludeKeywords` (type: `array`):

Remove listings whose published text, amenities, appliances, or pet policy contains any of these terms. Add one term per row.

## `requireApplicationUrl` (type: `boolean`):

Keep only listings that publish a public application link. Defaults to off so listings without an application link are not discarded.

## `scrapeDetails` (type: `boolean`):

Fetch each listing detail page for full description, amenities, pet policy, photos, showing link, office name, and phone. This adds one request per listing.

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

Maximum number of matching unique rental listings to return across all source URLs.

## `maxPages` (type: `integer`):

Maximum number of paginated listing pages to read from each source URL while looking for matching records.

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

Minimum delay between requests to the same tenant. Values below the source crawl delay are raised automatically.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apg.appfolio.com/listings"
    }
  ],
  "cities": [],
  "postalCodes": [],
  "catPolicy": "any",
  "dogPolicy": "any",
  "sortBy": "date_posted",
  "includeKeywords": [],
  "excludeKeywords": [],
  "requireApplicationUrl": false,
  "scrapeDetails": false,
  "maxItems": 25,
  "maxPages": 10,
  "requestDelayMs": 10000
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://apg.appfolio.com/listings"
        }
    ],
    "cities": [],
    "postalCodes": [],
    "catPolicy": "any",
    "dogPolicy": "any",
    "sortBy": "date_posted",
    "includeKeywords": [],
    "excludeKeywords": [],
    "requireApplicationUrl": false,
    "scrapeDetails": false,
    "maxItems": 25,
    "maxPages": 10,
    "requestDelayMs": 10000
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/appfolio-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://apg.appfolio.com/listings" }],
    "cities": [],
    "postalCodes": [],
    "catPolicy": "any",
    "dogPolicy": "any",
    "sortBy": "date_posted",
    "includeKeywords": [],
    "excludeKeywords": [],
    "requireApplicationUrl": False,
    "scrapeDetails": False,
    "maxItems": 25,
    "maxPages": 10,
    "requestDelayMs": 10000,
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/appfolio-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://apg.appfolio.com/listings"
    }
  ],
  "cities": [],
  "postalCodes": [],
  "catPolicy": "any",
  "dogPolicy": "any",
  "sortBy": "date_posted",
  "includeKeywords": [],
  "excludeKeywords": [],
  "requireApplicationUrl": false,
  "scrapeDetails": false,
  "maxItems": 25,
  "maxPages": 10,
  "requestDelayMs": 10000
}' |
apify call getascraper/appfolio-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/appfolio-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/8eOCe2KuDagsXTMKN/builds/YM2q7t0W7Z81ub05G/openapi.json
