# Apartment Therapy Article Scraper (`vexaloom-labs/apartment-therapy-article-scraper`) Actor

Scrape articles from Apartment Therapy - home decor, interior design, DIY, and small-space content from apartmenttherapy.com, with title, author, category, tags, and image for each article.

- **URL**: https://apify.com/vexaloom-labs/apartment-therapy-article-scraper.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** News, Automation, Other
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Apartment Therapy Article Scraper

Collect **Apartment Therapy** articles about decorating, DIY, organizing, house tours, kitchen and bathroom makeovers, small-space living, shopping guides and home technology. Pull the newest posts, search by keyword across recent and historical content, or browse a topic. Every record is captured cookielessly — no login, API key or proxy setup.

### Modes

| Mode | What it returns |
|---|---|
| `getLatest` | Newest articles from the live feed, continuing into historical snapshots when `maxItems` is larger than the live feed |
| `searchArticles` | Keyword matches from the live feed, historical snapshots and the public news index |
| `browseCategory` | Articles carrying a selected topic tag, including historical snapshots |

`feed` selects the main home-and-design feed, the tech feed, or both. `authorFilter`, `dateFrom` and `dateTo` narrow any mode. `maxPages` controls how deep the historical scan goes, and `maxItems` caps the result.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `getLatest` | `getLatest`, `searchArticles` or `browseCategory` |
| `query` | string | – | Keywords for `searchArticles`; prefill is `small apartment ideas` |
| `category` | select | `main` | Topic for `browseCategory` (see list below) |
| `authorFilter` | string | – | Partial, case-insensitive author name |
| `feed` | select | `main` | `main`, `tech` or `all` |
| `sortBy` | select | `relevance` | `relevance`, `newest` or `oldest` |
| `dateFrom` | string | – | Earliest publish date, `YYYY-MM-DD` |
| `dateTo` | string | – | Latest publish date, `YYYY-MM-DD` |
| `maxItems` | integer | `50` | Maximum records to return (1–200) |
| `maxPages` | integer | `2` | Historical snapshots to scan (1–20; 1 = live feed only) |

Categories: `main`, `decorating`, `organizing`, `diy`, `shopping`, `small-spaces`, `kitchen`, `bathroom`, `bedroom`, `living-room`, `house-tours`, `before-and-after`, `home-projects`, `cleaning`, `plants`, `real-estate`, `money`, `life`, `tech`, `news`.

#### Examples

Newest articles:

```json
{"mode": "getLatest", "maxItems": 25}
```

Keyword search across the archive:

```json
{"mode": "searchArticles", "query": "small kitchen storage", "maxItems": 40, "maxPages": 6}
```

Browse a topic with an author and date filter:

```json
{"mode": "browseCategory", "category": "before-and-after", "authorFilter": "sarah", "dateFrom": "2026-01-01", "maxItems": 30, "maxPages": 8}
```

Deeper history for the latest timeline:

```json
{"mode": "getLatest", "maxItems": 150, "maxPages": 10}
```

### Output

| Field | Type | Description |
|---|---|---|
| `title` | string | Article headline |
| `articleUrl` | string | Canonical article URL on apartmenttherapy.com |
| `sourceUrl` | string | Same canonical URL, provided as the standard source field |
| `articleId` | string | Numeric article ID from the URL |
| `slug` | string | URL slug without the numeric ID |
| `author` | string | Author byline |
| `publishDate` | string | Publication date, ISO 8601 UTC |
| `category` | string | Primary topic as published |
| `categorySlug` | string | Normalised topic slug |
| `tags` | array | Public topic tags |
| `summary` | string | Short article description |
| `imageUrl` | string | Lead image URL |
| `feed` | string | `main`, `tech` or `web` |
| `dataSource` | string | `live`, `archive` or `webSearch` |
| `isSponsored` | boolean | Present when the article is marked sponsored |
| `hasVideo` | boolean | Present when the article carries the video tag |
| `recordType` | string | Always `article` |
| `scrapedAt` | string | Capture time, ISO 8601 UTC |

Empty fields are omitted, never emitted as `null`.

### Data sources and limits

- **Live feed** — Apartment Therapy's public RSS feeds carry the newest 20 main-feed posts and 20 tech posts, including title, author, date, categories, summary and lead image.
- **Historical snapshots** — the public Internet Archive keeps snapshots of the main feed. `maxPages` scans them newest-first for older complete records. Coverage depends on snapshot availability, so very deep history is not guaranteed.
- **News index** — keyword search supplements the feed and snapshots with results from Google News' public Apartment Therapy index. These records carry title, date and canonical URL; author, summary, category and image are omitted when the index does not provide them.
- **WordPress REST API** — `/wp-json/wp/v2/...` returns `403 Access denied` to cookieless server clients (direct, datacenter proxy and residential proxy all tested). The actor uses the public feeds and index instead.
- Category browsing uses the real topic tags carried by feed and snapshot records. A category that has no recent or snapshotted articles returns no records; raise `maxPages` to search deeper.

### FAQ

**How many articles can one run return?** `maxItems` accepts 1–200. The live feed covers the newest 20 per feed; historical snapshots and the news index supply older records.

**Why do some search results lack an author or image?** Search-index records only expose title, publish date and URL. Complete records come from the live feed or historical snapshots.

**Can I combine a keyword with a category?** Yes. `searchArticles` honours `category` and `authorFilter` for feed and snapshot records. When either filter is set, search-index records are skipped because they cannot prove the match.

**How do I get the whole archive?** There is no complete public archive endpoint. Use larger `maxPages` values and partition with `category`, `authorFilter`, `dateFrom` and `dateTo` to reach more records.

**Is this affiliated with Apartment Therapy?** No. This is an independent actor that reads publicly published content and is not affiliated with or endorsed by Apartment Therapy.

# Actor input Schema

## `mode` (type: `string`):

What to scrape: getLatest (newest articles), searchArticles (keyword search across the live feed and archive), or browseCategory (browse a topic).

## `query` (type: `string`):

Keyword(s) to search in titles, summaries, categories and tags. Used when mode=searchArticles.

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

Topic to browse. Used when mode=browseCategory; `main` means all topics.

## `authorFilter` (type: `string`):

Keep only articles whose author name contains this text (case-insensitive).

## `feed` (type: `string`):

Which Apartment Therapy feed to read: main (home & design), tech (home technology), or all.

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

Result order. relevance suits keyword searches; newest and oldest sort by publish date.

## `dateFrom` (type: `string`):

Optional earliest publish date, YYYY-MM-DD.

## `dateTo` (type: `string`):

Optional latest publish date, YYYY-MM-DD.

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

Maximum number of articles to return (1–200).

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

How many historical RSS snapshots to scan beyond the live feed. 1 = live feed only; 20 = deepest available history.

## Actor input object example

```json
{
  "mode": "getLatest",
  "query": "small apartment ideas",
  "category": "main",
  "feed": "main",
  "sortBy": "relevance",
  "maxItems": 3,
  "maxPages": 1
}
```

# Actor output Schema

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

All records from the run, in the default dataset.

# 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 = {
    "mode": "getLatest",
    "query": "small apartment ideas",
    "category": "main",
    "feed": "main",
    "sortBy": "relevance",
    "maxItems": 3,
    "maxPages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/apartment-therapy-article-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 = {
    "mode": "getLatest",
    "query": "small apartment ideas",
    "category": "main",
    "feed": "main",
    "sortBy": "relevance",
    "maxItems": 3,
    "maxPages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/apartment-therapy-article-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 '{
  "mode": "getLatest",
  "query": "small apartment ideas",
  "category": "main",
  "feed": "main",
  "sortBy": "relevance",
  "maxItems": 3,
  "maxPages": 1
}' |
apify call vexaloom-labs/apartment-therapy-article-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/apartment-therapy-article-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/ceT4Bd8EBeouwgBYr/builds/TRehfRTcsvFM1YSMo/openapi.json
