# WordPress Plugin & Theme Scraper — Installs & Ratings (`haketa/wordpress-directory-scraper`) Actor

Scrape the WordPress.org plugin & theme directory: active installs, total downloads, rating, review count, version, PHP/WP requirements, support stats, author and dates. For plugin market intelligence, ASO and competitive research.

- **URL**: https://apify.com/haketa/wordpress-directory-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Developer tools
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.75 / 1,000 results

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

## WordPress Plugin & Theme Scraper — Installs, Downloads & Ratings

> **Extract the entire WordPress.org plugin & theme directory as structured data: active installs, total downloads, rating & review count, full star breakdown, version, PHP/WordPress requirements, support-thread stats, author, icon/screenshot, and dates.** Search by keyword, browse by tag, or pull ranking feeds and get clean data in seconds — **no coding, no login required**.

Export directly to **JSON, CSV, Excel, or API**.

> Built for WordPress plugin & theme developers, digital agencies, SaaS founders sizing market opportunities, ASO / "plugin store optimization" marketers, security & compatibility auditors, and data teams building WordPress ecosystem intelligence.

[![WordPress Directory](https://img.shields.io/badge/WordPress.org-Plugins%20%26%20Themes-21759b?style=for-the-badge\&logo=wordpress\&logoColor=white)]()
[![Installs & Downloads](https://img.shields.io/badge/Installs%20%2B%20Downloads%20%2B%20Rating-2da44e?style=for-the-badge\&logo=counter-strike\&logoColor=white)]()
[![Market Intelligence](https://img.shields.io/badge/Plugin%20Market%20Intelligence-8250df?style=for-the-badge\&logo=databricks\&logoColor=white)]()
[![Export Formats](https://img.shields.io/badge/Export-JSON%20%2F%20CSV%20%2F%20Excel-fb8500?style=for-the-badge\&logo=google-sheets\&logoColor=white)]()
[![Pagination](https://img.shields.io/badge/Pagination-1%2C000%2B%20Deep%20Extraction-00b4d8?style=for-the-badge\&logo=speedtest\&logoColor=white)]()
[![Maintenance](https://img.shields.io/badge/Maintained-Active%202026-brightgreen?style=for-the-badge)]()

***

### ⚡ At a glance

| Feature | Specification |
|---|---|
| **Data Targets** | WordPress Plugins and Themes directory |
| **Search Capabilities** | Search terms, directory tags, and ranking feeds (`popular`, `new`, `updated`, `top-rated`, `featured`) |
| **Max Scale** | 1,000+ to 10,000+ records per run with unlimited auto-pagination (`maxPages: 0`) |
| **Core Metrics** | Active installs (bucketed), total downloads, 0–100 & 0–5 ratings, full 1★–5★ review distribution |
| **Technical Specs** | Min WordPress version, tested up to WP version, min PHP version, current release version |
| **Lead & Dev Intel** | Author display name, WordPress.org author profile URL, official homepage, donation link |
| **Support Health** | Total support threads (last 2 months) & resolved thread counts |
| **Export Formats** | Dataset (JSON, CSV, Excel, XML) + Key-Value Store `OUTPUT` sync |
| **Execution Speed** | ~100 plugins in under 12 seconds; ~500 plugins in ~30 seconds |
| **Proxy Requirement** | Public directory access — Datacenter proxies enabled by default |
| **Data Cleanliness** | Automatic HTML stripping, entity decoding, and scheme-less asset URL normalization |

***

### 🔎 Why scrape the WordPress Directory?

The **WordPress.org** directory is the single largest public marketplace in the open-web ecosystem — hosting over **60,000+ plugins** and **thousands of themes** powering more than 40% of all websites globally. Each listing carries vital commercial and technological intelligence: **active installs**, **total historical downloads**, **ratings**, **review volume**, **version release cadence**, and **support resolution ratios**.

Collecting this market intelligence manually is tedious and unscalable:

- The web interface limits visibility to 10 results per page.
- Review star distributions require manual drill-downs.
- Historical download counters and technical PHP/WP requirements are scattered across multiple sub-pages.
- Manually compiling competitive intelligence or sizing a product category takes hours of error-prone copy-pasting.

This **WordPress Directory Scraper** turns the entire directory into an automated, structured data pipeline. Whether you need to benchmark direct rivals, monitor compatibility flags before core WordPress releases, or generate developer leads, you can extract 1,000+ listings in seconds.

***

### 🎯 High-Impact Use Cases

#### 1. Plugin Market Intelligence & Niche Sizing

Quantify total addressable market (TAM) across specific categories such as SEO, e-commerce, caching, forms, or security. Calculate market share percentages by summing active installs across competing solutions and monitor overall install velocity.

#### 2. App Store Optimization (ASO) & Competitive Benchmarking

Analyze which plugins win top search positions for target keywords. Benchmark your listing’s rating score, review velocity, and 5-star versus 1-star ratios against industry leaders to optimize your titles, tags, and descriptions for organic directory discovery.

#### 3. Compatibility & Security Auditing

Identify abandoned or high-risk plugins running across client websites. Filter listings by `lastUpdated`, `testedWp`, and `requiresPhp` to detect software that has not been updated for recent PHP or major WordPress core milestones.

#### 4. B2B Partnerships & Developer Lead Generation

Discover active, high-volume plugin authors and agencies. Extract verified author profile URLs, official plugin homepages, and developer donation links to source acquisition targets, partnership opportunities, or service clients.

#### 5. Product Roadmapping & Feature Discovery

Track the `new` and `updated` feeds to identify emerging product categories, rising developer trends, and popular feature integrations across the ecosystem before they reach mainstream adoption.

#### 6. Agency Tech Stack Standardization

WordPress agencies managing hundreds of client properties use this data to curate an internal roster of approved, actively maintained plugins with verified PHP 8+ compatibility and responsive developer support.

***

### ✨ Key Features & Capabilities

- ✅ **Multi-Source Hybrid Runs:** Search by keywords (`seo`, `woocommerce`, `security`), browse directory tags (`cache`, `forms`), and extract ranking feeds (`popular`, `featured`, `top-rated`) all in a single run.
- ✅ **Automatic Slug De-duplication:** Overlapping sources are automatically deduplicated by unique directory slug, ensuring clean, unique datasets without duplicate entries.
- ✅ **Deep 1,000+ Pagination:** Automatically traverses 100 items per page with zero artificial caps when `maxPages` is set to `0` (auto/unlimited governed by `maxItems`).
- ✅ **Dual Directory Coverage:** Seamlessly extract both plugins and themes by toggling the `type` selector.
- ✅ **Rich Technical & Social Data:** Captures compatibility requirements, resolved support thread ratios, full review breakdowns, and direct ZIP download links.
- ✅ **Clean Data Normalization:** Strips HTML entities, resolves numeric characters, converts scheme-less asset URLs to full `https://` links, and types all numeric values cleanly.
- ✅ **Dual Storage Output:** Writes to Apify default dataset for tabular export and syncs with Key-Value Store `OUTPUT` for rapid synchronous programmatic access.

***

### 📥 Input Parameters

All parameters are optional. Running the actor with empty `{}` inputs automatically extracts the top 100 listings from the `popular` browse feed.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `type` | String | `"plugins"` | Directory to scrape: `"plugins"` or `"themes"`. |
| `searchTerms` | Array | `["seo"]` | Search keywords (e.g. `["seo", "security", "backup"]`). |
| `tags` | Array | `[]` | Specific directory tags to browse (e.g. `["ecommerce", "caching"]`). |
| `browse` | Array | `["popular"]` | Directory feeds: `popular`, `new`, `updated`, `top-rated`, `featured`. |
| `maxItems` | Integer | `0` | Max total records to extract across all sources. `0` = unlimited. |
| `maxPages` | Integer | `0` | Max pages per source (100 items/page). `0` = unlimited (governed by `maxItems`). |
| `proxyConfiguration` | Object | `{ "useApifyProxy": true }` | Proxy settings. Public directory data operates reliably with Datacenter proxies. |

#### Example Input Configuration

```json
{
  "type": "plugins",
  "searchTerms": ["seo", "speed optimization"],
  "tags": ["caching"],
  "browse": ["popular"],
  "maxItems": 500,
  "maxPages": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

***

### 📤 Output Data Structure

Every extracted plugin or theme is saved as an individual record in the default dataset. Below is an authentic sample record:

```json
{
  "type": "plugin",
  "slug": "seo-by-rank-math",
  "name": "Rank Math SEO – AI SEO Tools to Dominate SEO Rankings",
  "version": "1.0.280",
  "author": "Rank Math SEO",
  "authorProfile": "https://profiles.wordpress.org/rankmath/",
  "activeInstalls": 4000000,
  "downloaded": 201047092,
  "rating": 96,
  "ratingStars": 4.8,
  "numRatings": 7520,
  "supportThreads": 44,
  "supportThreadsResolved": 39,
  "requiresWp": "6.7",
  "testedWp": "7.1.4",
  "requiresPhp": "7.4",
  "lastUpdated": "2026-10-06 12:43pm GMT",
  "added": "2018-11-19",
  "homepage": "https://rankmath.com/",
  "shortDescription": "Grow your organic traffic and AI visibility with powerful SEO tools, XML sitemaps, Schema automation, and built-in AI SEO, all in one place.",
  "tags": ["google search console", "redirection", "schema", "seo", "xml sitemap"],
  "donateLink": "https://rankmath.com/donate/",
  "downloadLink": "https://downloads.wordpress.org/plugin/seo-by-rank-math.1.0.280.zip",
  "image": "https://ps.w.org/seo-by-rank-math/assets/icon.svg?rev=3438330",
  "previewUrl": "",
  "ratingsBreakdown": {
    "5": 7083,
    "4": 144,
    "3": 53,
    "2": 44,
    "1": 196
  },
  "url": "https://wordpress.org/plugins/seo-by-rank-math/",
  "source": "search:seo",
  "scrapedAt": "2026-11-10T14:30:15.120Z"
}
```

***

### 📊 Extracted Fields Reference

#### 🏷️ Identity & Overview Fields

| Field Name | Type | Coverage | Description |
|---|---|---|---|
| `type` | String | 🟢 High (100%) | Record type: `plugin` or `theme`. |
| `slug` | String | 🟢 High (100%) | Unique directory slug used for deduplication. |
| `name` | String | 🟢 High (100%) | Full listing title with decoded HTML entities. |
| `url` | String | 🟢 High (100%) | Canonical public directory URL on WordPress.org. |
| `shortDescription` | String | 🟢 High (98%) | Plaintext summary of features and capabilities. |
| `tags` | Array | 🟢 High (95%) | Directory tags and categorization keywords. |

#### 📈 Metrics & Rating Fields

| Field Name | Type | Coverage | Description |
|---|---|---|---|
| `activeInstalls` | Integer | 🟢 High (100%) | Active install count (bucketed milestone, e.g. `4000000`). |
| `downloaded` | Integer | 🟢 High (100%) | Total cumulative downloads across all releases. |
| `rating` | Integer | 🟢 High (100%) | Official percentage rating score (0–100 scale). |
| `ratingStars` | Float | 🟢 High (100%) | Normalized 5-star rating (0.0–5.0). |
| `numRatings` | Integer | 🟢 High (100%) | Total number of published user reviews. |
| `ratingsBreakdown` | Object | 🟢 High (100%) | Breakdown of review counts across 1, 2, 3, 4, and 5 stars. |

#### 🛠️ Technical Compatibility & Support

| Field Name | Type | Coverage | Description |
|---|---|---|---|
| `version` | String | 🟢 High (100%) | Current release version string. |
| `requiresWp` | String | 🟢 High (95%) | Minimum WordPress core version required. |
| `testedWp` | String | 🟢 High (95%) | Highest WordPress core version tested. |
| `requiresPhp` | String | 🟡 Conditional (90%) | Minimum PHP version required by developer. |
| `supportThreads` | Integer | 🟡 Conditional (Plugins) | Total support threads in the last 60 days. |
| `supportThreadsResolved` | Integer | 🟡 Conditional (Plugins) | Number of support threads marked resolved. |

#### 👤 Author, Media & Distribution

| Field Name | Type | Coverage | Description |
|---|---|---|---|
| `author` | String | 🟢 High (100%) | Clean author or company name. |
| `authorProfile` | String | 🟢 High (98%) | Public profile link for the developer on WordPress.org. |
| `homepage` | String | 🟡 Conditional (87%) | Official product or agency homepage URL. |
| `donateLink` | String | 🟡 Conditional (40%) | Author donation or sponsorship link. |
| `downloadLink` | String | 🟡 Conditional (Plugins) | Direct `.zip` package download URL. |
| `image` | String | 🟢 High (98%) | Normalized plugin icon SVG/PNG or theme screenshot. |
| `previewUrl` | String | 🟡 Conditional (Themes) | Live demo preview URL for WordPress themes. |
| `added` | String | 🟢 High (99%) | Date the listing was first added to the directory. |
| `lastUpdated` | String | 🟢 High (100%) | Date and time of the most recent package update. |
| `source` | String | 🟢 High (100%) | Origin query (e.g. `search:seo`, `browse:popular`). |
| `scrapedAt` | String | 🟢 High (100%) | ISO 8601 timestamp of extraction. |

***

### 🔁 Deep Pagination & High-Volume Extraction

This scraper is architected for large-scale data extraction:

- **100 Items per Page:** The scraper requests maximum allowed page batches to minimize network round-trips.
- **Deep Pagination Support:** With `maxPages: 0`, the scraper follows pagination links sequentially until all records matching your query are gathered.
- **Multi-Query Scaling:** When supplying multiple keywords, tags, or browse feeds, records are pulled across all categories and de-duplicated on the fly.
- **Zero Caps on High Limits:** Requesting 1,000, 5,000, or 20,000 records works smoothly without arbitrary artificial limits.

***

### 🔄 Data Workflows & Pipeline Automation

Connecting extracted WordPress intelligence into existing business workflows is straightforward:

1. **Google Sheets Automated Sync:** Connect your Apify run to Google Sheets using the official Apify Google Sheets integration or Make/Zapier. Automatically append new rows whenever a monitored category updates.
2. **PostgreSQL / Snowflake Warehouse Ingestion:** Ingest raw JSON or flattened CSV output into analytical databases using Apify's REST API or Airbyte connectors to power internal BI dashboards.
3. **Slack / Discord Alerting:** Set up webhooks triggered when a competitor's plugin releases a new major version or experiences an unusual spike in 1-star reviews.
4. **CRM Lead Enrichment:** Match plugin developer homepages and profile links against company domain registries to enrich prospective B2B agency or SaaS sales leads.

***

### 📋 Comprehensive Format Comparison

| Format | Best Used For | Notes |
|---|---|---|
| **JSON** | Custom applications, developer APIs, database ingestion | Full nested structure including `ratingsBreakdown` objects and `tags` arrays. |
| **CSV** | Excel analysis, Google Sheets, quick data filtering | Arrays and nested objects are stringified for easy columnar manipulation. |
| **Excel (.xlsx)** | Stakeholder reports, executive presentations, offline analysis | Pre-formatted spreadsheet ready for pivot tables and charts. |
| **XML / HTML** | Legacy system ingestion, web publishing | Clean hierarchical XML representation of listing data. |

***

### 💻 Programmatic Integration & SDK Usage

Run this scraper programmatically and pipe extracted data into your data warehouse, analysis pipeline, or automation platform.

#### Python SDK Example

```python
from apify_client import ApifyClient
import pandas as pd

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "type": "plugins",
    "searchTerms": ["woocommerce payment", "stripe"],
    "maxItems": 500,
    "maxPages": 0
}

## Run actor synchronously
run = client.actor("haketa/wordpress-directory-scraper").call(run_input=run_input)

## Fetch dataset items and load into Pandas DataFrame
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
df = pd.DataFrame(items)

print(f"Extracted {len(df)} plugins.")
top_plugins = df.sort_values(by="activeInstalls", ascending=False)[["name", "activeInstalls", "ratingStars"]]
print(top_plugins.head(10))
```

#### JavaScript / Node.js SDK Example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/wordpress-directory-scraper').call({
    type: 'plugins',
    searchTerms: ['backup', 'security'],
    maxItems: 300,
    maxPages: 0,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Extracted ${items.length} plugins.`);
```

#### cURL API Example

```bash
curl -X POST "https://api.apify.com/v2/acts/haketa~wordpress-directory-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "plugins",
    "browse": ["popular"],
    "maxItems": 100
  }'
```

***

### 💡 Practical Pro-Tips

1. **Category TAM Analysis:** Run a search for broad niche keywords like `"form builder"` or `"security"` with `maxItems: 0` to compute market dominance and total installs for that sector.
2. **Track Maintenance Health:** Compute the resolution ratio using `supportThreadsResolved / supportThreads` to gauge customer satisfaction and development responsiveness.
3. **Stale Plugin Discovery:** Filter results where `lastUpdated` is older than 24 months to identify abandonware opportunities for building modern replacements.
4. **ASO Star Distribution:** Look at the ratio of 5-star versus 1-star reviews in `ratingsBreakdown` to find polarizing plugins with dissatisfied user bases.
5. **Scheduled Monitoring:** Set up weekly Apify schedules to track install count growth and review velocity across your competitors.
6. **Theme Aesthetics Intelligence:** When scraping themes, analyze `image` and `previewUrl` fields to build visual galleries of trending design styles in the WordPress repository.

***

### ❓ Frequently Asked Questions

##### Do I need a WordPress.org account or API key?

No. All listings are publicly accessible directory records. No API key, login token, or authentication is required.

##### What is the difference between active installs and total downloads?

`activeInstalls` represents WordPress.org's current estimated number of active websites running the plugin (e.g. 100,000+, 1,000,000+). `downloaded` tracks all-time cumulative `.zip` downloads across every version ever released.

##### Can I extract themes as well as plugins?

Yes. Simply set `"type": "themes"` in the input. The scraper automatically adapts its extraction schema to capture theme-specific screenshots, demo preview URLs, and author profile details.

##### What proxy type should I use?

The default Apify Datacenter proxies are fully sufficient and provide high-speed execution at the lowest cost tier.

##### How do I export data to Excel or Google Sheets?

Once the run finishes, navigate to the **Dataset** tab in the Apify Console. Click **Export** and select your desired format: **CSV**, **Excel (.xlsx)**, **JSON**, or **XML**. You can also connect the dataset directly to Google Sheets via the Apify Google Sheets integration.

##### Can I filter by minimum install counts or ratings?

You can extract listings for your target keywords or feeds and use Apify's dataset filtering or export options (such as CSV/JSON filtering) to filter by `activeInstalls >= 100000` or `ratingStars >= 4.5`.

##### Are download links direct package archives?

Yes. For plugins, `downloadLink` points directly to the official release `.zip` archive hosted on the WordPress.org CDN.

##### Does this actor bypass or interfere with anti-bot protections?

No. The directory data is completely open and public. The scraper operates via standard high-efficiency requests without attempting any form of challenge bypass.

##### How frequently should I run this scraper?

For competitive tracking, a weekly or bi-weekly scheduled run is ideal since WordPress directory metrics (active installs, reviews, version updates) update on a periodic schedule.

***

### 📋 Changelog

#### Version 1.2 (2026-11)

- **Deep 1,000+ Pagination Unlocked:** Updated `maxPages` default to `0` (auto/unlimited governed by `maxItems`), allowing uninterrupted pagination across large search and category feeds.
- **Infinite Loop Cap Removal:** Fixed pagination boundary logic so `maxPages: 0` correctly behaves as `Infinity` instead of early termination.
- **Fast Prefill Execution:** Optimized prefill configurations to complete high-volume extractions in under 15 seconds.
- **Enhanced Data Sanitization:** Refactored HTML entity decoding and scheme-less asset URL normalization to ensure 100% valid `https://` media links.
- **Store Schema Compliance:** Fully validated input, output, and dataset specifications against Apify Specification v1 with complete dataset views.

#### Version 1.1 (2026-10)

- Added full review star distribution breakdown (`ratingsBreakdown`) for 1–5 star reviews.
- Added support for theme screenshot and live preview URL extraction.
- Introduced automated de-duplication by listing slug.

#### Version 1.0 (2026-09)

- Initial release featuring plugin and theme directory extraction via search keywords, tags, and ranking feeds.

# Changelog

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

# Actor input Schema

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

Which directory to scrape.

## `searchTerms` (type: `array`):

Keywords to search (e.g. seo, security, backup, woocommerce). Each returns matching plugins/themes.

## `tags` (type: `array`):

Directory tags to browse (e.g. ecommerce, cache, forms).

## `browse` (type: `array`):

Ranking feeds: popular, new, updated, top-rated, featured.

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

Maximum plugins/themes across all sources. 0 = no limit (100 per page).

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

Maximum result pages per search/tag/feed (100 items per page). 0 = auto/unlimited (governed by Max items).

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

Apify Proxy. The WordPress.org API is public — datacenter is enough and enabled by default.

## Actor input object example

```json
{
  "type": "plugins",
  "searchTerms": [
    "seo"
  ],
  "browse": [
    "popular"
  ],
  "maxItems": 100,
  "maxPages": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

plugin | theme

## `slug` (type: `string`):

Directory slug

## `name` (type: `string`):

Name

## `version` (type: `string`):

Current version

## `author` (type: `string`):

Author

## `activeInstalls` (type: `string`):

Active installs

## `downloaded` (type: `string`):

Total downloads

## `rating` (type: `string`):

Rating 0-100

## `ratingStars` (type: `string`):

Rating in stars

## `numRatings` (type: `string`):

Number of ratings

## `supportThreads` (type: `string`):

Support threads

## `supportThreadsResolved` (type: `string`):

Resolved support threads

## `requiresWp` (type: `string`):

Min WordPress version

## `testedWp` (type: `string`):

Tested up to WP version

## `requiresPhp` (type: `string`):

Min PHP version

## `lastUpdated` (type: `string`):

Last update

## `added` (type: `string`):

Date added

## `homepage` (type: `string`):

Homepage URL

## `shortDescription` (type: `string`):

Short description

## `tags` (type: `string`):

Tags

## `donateLink` (type: `string`):

Author donate URL (when set)

## `downloadLink` (type: `string`):

ZIP download link

## `image` (type: `string`):

Plugin icon or theme screenshot URL

## `previewUrl` (type: `string`):

Live theme preview URL (themes)

## `ratingsBreakdown` (type: `string`):

Star distribution counts {5,4,3,2,1}

## `url` (type: `string`):

Directory URL

## `source` (type: `string`):

Search/tag/browse source

## `scrapedAt` (type: `string`):

ISO timestamp

# 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 = {
    "type": "plugins",
    "searchTerms": [
        "seo"
    ],
    "browse": [
        "popular"
    ],
    "maxItems": 100,
    "maxPages": 0,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/wordpress-directory-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 = {
    "type": "plugins",
    "searchTerms": ["seo"],
    "browse": ["popular"],
    "maxItems": 100,
    "maxPages": 0,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/wordpress-directory-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 '{
  "type": "plugins",
  "searchTerms": [
    "seo"
  ],
  "browse": [
    "popular"
  ],
  "maxItems": 100,
  "maxPages": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/wordpress-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/wordpress-directory-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/eSBl4tXE4aZmoB5Nu/builds/0Kc3nzIboQLu97wP5/openapi.json
