# WordPress Plugin & Theme Scraper - Installs, Ratings & Leads (`scrapesage/wordpress-plugin-theme-scraper`) Actor

Scrape WordPress.org plugins & themes: active installs, downloads, ratings, support stats, version history, changelogs, WP/PHP compatibility, business model & author contact leads. Search by keyword, tag or author. Monitor mode for new/changed items. Export JSON, CSV, Excel.

- **URL**: https://apify.com/scrapesage/wordpress-plugin-theme-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 plugin / theme scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## WordPress Plugin & Theme Scraper — Installs, Ratings, Changelogs & Author Leads

Extract **complete WordPress.org plugin and theme data** — including the fields most scrapers skip: **real active-install counts, full ratings histograms, support-thread resolution rates, version history, changelogs, WP/PHP compatibility, contributors, and business model**. Optionally turn every plugin/theme author into a **ready-to-contact B2B lead** by crawling their own website for **emails, phone numbers, and social links**.

No login, no API key, no browser — fast JSON extraction from the official WordPress.org directory API with 99%+ reliability.

### Why this WordPress scraper?

WordPress powers ~43% of the web, and its directory holds **60,000+ plugins** and **12,000+ themes**. Most scrapers return a slug, a name, and a rating. This actor pulls the full directory record and ships the **richest dataset in the category**:

| Data | Typical scrapers | This actor |
|---|---|---|
| Active installs + human-readable text + bucket | partial | ✅ |
| Total downloads | ❌ | ✅ |
| Full ratings histogram (1–5 ★ counts) | ❌ | ✅ |
| Support threads + **resolution rate** | ❌ | ✅ |
| Version history + version count | ❌ | ✅ |
| Changelog / FAQ / installation text | ❌ | ✅ |
| WP "requires", "tested up to", "requires PHP" | partial | ✅ |
| Business model (commercial / community) | ❌ | ✅ |
| Contributors (with profiles) | ❌ | ✅ |
| Days since update + **abandoned flag** | ❌ | ✅ |
| Author **website, emails, phone, socials** | ❌ | ✅ opt-in |
| Lead score (0–100) per author | ❌ | ✅ |
| Monitor mode — only new / changed items | ❌ | ✅ |

### Use cases

- **Plugin & theme competitive intelligence** — track a competitor's `activeInstalls`, `rating`, `numRatings`, version cadence (`availableVersions`, `lastUpdatedDate`) and `supportResolutionRate` over time. Monitor mode returns only what changed.
- **Lead generation** — plugin & theme authors are active buyers and partners (hosting, security, CDN, support tooling, white-label, acquisitions). Score them by reach (`activeInstalls`, `leadScore`), flag the monetizing ones (`businessModel: "commercial"`, `donateLink`, `commercialSupportUrl`), and contact them directly (`contactEmails`).
- **Acquisition & M\&A sourcing** — find established, well-rated, recently maintained plugins/themes in a niche (`tags`, `minActiveInstalls`, `minRating`) and reach the author. Use the **authors** mode to pull a publisher's entire portfolio.
- **Market & ecosystem research** — size a category (SEO, WooCommerce, security, backups, page builders), benchmark ratings and install distributions, and spot abandoned plugins (`isAbandoned`) ripe for replacement.
- **Security & compatibility auditing** — surface plugins not tested with the latest WordPress (`testedUpToWp`), with low `requiresPhp`, or long abandoned.
- **Directory / SEO content** — power "best X plugins" listicles, comparison tables, and plugin directories with structured, always-fresh data.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **WordPress Plugin & Theme Scraper**, pick a **mode**, enter keywords / tags / authors (or paste plugin/theme URLs), and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "mode": "searchPlugins",
    "searchQueries": ["seo", "woocommerce payments"],
    "tags": ["security"],
    "browse": "popular",
    "maxResults": 200,
    "fullDetails": true,
    "minActiveInstalls": 1000,
    "enrichContacts": true,
    "monitorMode": false
}
```

- **mode** — `searchPlugins` / `searchThemes` (search or browse the directory) or `pluginDetails` / `themeDetails` (specific items by slug or URL).
- **searchQueries** — keywords; each is scraped separately (`seo`, `backup`, `contact form`).
- **browse** — a curated list: `popular`, `featured`, `new`, `updated`, `top-rated`.
- **tags** — directory tag slugs (`woocommerce`, `security`, `gutenberg`, `elementor`).
- **authors** — WordPress.org usernames to pull a publisher's entire portfolio (`automattic`).
- **slugs / startUrls** — for the "Specific…" modes: slugs (`woocommerce`, `astra`) or full directory URLs.
- **maxResults** — cap across all queries.
- **fullDetails** *(default true)* — fetch the complete record (contributors, versions, changelog, screenshots, business model) for every result.
- **minActiveInstalls / minRating** — keep only established / well-rated items.
- **includeRawData** *(default false)* — attach the untouched API response under `raw`.
- **enrichContacts** *(default false)* — crawl each author's website (home + contact/about, max 3 pages) for emails, phones, and socials. WordPress.org never exposes emails — this is the only way to get them.
- **monitorMode** *(default false)* — only output new / changed items vs. the previous run (see below).
- **monitorField** — what counts as a change: `any`, `version`, `active_installs`, or `last_updated`.
- **onlyNew** — in monitor mode, output only items never seen before.
- **monitorKey** — namespace for the monitor memory (use a stable, unique value per watch).

### Output

One record per plugin (`type: "plugin"`) or theme (`type: "theme"`):

```json
{
    "type": "plugin",
    "slug": "seo-by-rank-math",
    "name": "Rank Math SEO – AI SEO Tools to Dominate SEO Rankings",
    "url": "https://wordpress.org/plugins/seo-by-rank-math/",
    "version": "1.0.272",
    "shortDescription": "Rank Math SEO is the best WordPress SEO plugin…",
    "author": "Rank Math SEO",
    "authorProfileUrl": "https://profiles.wordpress.org/rankmath/",
    "authorUsername": "rankmath",
    "contributors": [{ "username": "rankmath", "displayName": "Rank Math SEO", "profileUrl": "https://profiles.wordpress.org/rankmath/" }],
    "activeInstalls": 4000000,
    "activeInstallsText": "4+ million",
    "installsBucket": "1M+",
    "downloaded": 183628786,
    "rating": 96,
    "ratingStars": 4.8,
    "numRatings": 7444,
    "ratingsHistogram": { "5": 7015, "4": 142, "3": 51, "2": 42, "1": 194 },
    "supportThreads": 65,
    "supportThreadsResolved": 64,
    "supportResolutionRate": 98,
    "requiresWp": "6.3",
    "testedUpToWp": "7.0",
    "requiresPhp": "7.4",
    "lastUpdated": "2026-06-10 8:09am GMT",
    "lastUpdatedDate": "2026-06-10",
    "daysSinceUpdate": 6,
    "added": "2018-11-19",
    "ageDays": 2766,
    "isAbandoned": false,
    "homepage": "https://rankmath.com/",
    "businessModel": "commercial",
    "monetized": true,
    "tags": ["SEO", "Google Search Console", "schema", "sitemap"],
    "availableVersions": ["1.0.270", "1.0.271", "1.0.272"],
    "versionsCount": 412,
    "leadScore": 92,
    "contactWebsite": "https://rankmath.com",
    "contactEmails": ["support@rankmath.com"],
    "socialLinks": { "twitter": "https://twitter.com/rankmathseo", "facebook": "https://facebook.com/rankmath" },
    "searchQuery": "search:seo",
    "scrapedAt": "2026-06-16T22:00:00.000Z"
}
```

Theme records add `screenshotUrl`, `previewUrl`, `isCommercial` / `isCommunity`, `externalRepositoryUrl`, `isChildTheme` / `parentTheme`, and `created`.

### Monitor mode (and how it works with Apify Schedules)

Turn on **monitorMode** and the actor remembers every item it has seen (in a private key-value store keyed by `monitorKey`). On the next run it outputs **only the new items or the ones whose version / active installs / last-updated date changed**.

This is **independent of, and complementary to, [Apify Schedules](https://docs.apify.com/platform/schedules)**: the schedule simply triggers the run on your cadence (hourly/daily/weekly), and monitor mode decides what's worth emitting. There is no conflict — point a Schedule at the actor with `monitorMode: true` and you get a clean feed of only the deltas, perfect for Slack alerts, changelog feeds, or competitor dashboards. Use a distinct `monitorKey` per watch so different jobs don't share memory.

### Automate & schedule

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly with `monitorMode` to track a niche or a competitor's plugins.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, changelog post) the moment a run finishes.

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

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

const run = await client.actor('scrapesage/wordpress-plugin-theme-scraper').call({
    mode: 'searchPlugins',
    searchQueries: ['woocommerce'],
    minActiveInstalls: 5000,
    enrichContacts: true,
    maxResults: 200,
});

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

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new author leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get alerted when a monitored plugin ships a new version.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find the top WooCommerce plugins with over 100k installs and list their authors' contact emails" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **app-marketplace & developer intelligence stack**:

- **[Chrome Web Store Scraper](https://apify.com/scrapesage/chrome-web-store-scraper)** — extensions, ratings & developer leads.
- **[Shopify App Store Scraper](https://apify.com/scrapesage/shopify-app-store-scraper)** — apps, reviews & developer leads.
- **[Apple App Store Scraper](https://apify.com/scrapesage/app-store-scraper)** — apps, reviews & charts.
- **[Google Play Store Scraper](https://apify.com/scrapesage/google-play-scraper)** — apps, reviews & developer leads.
- **[Shopify Store Scraper](https://apify.com/scrapesage/shopify-store-scraper)** — products, variants, prices & merchant leads.
- **[GitHub Scraper](https://apify.com/scrapesage/github-scraper)** — repos, developers & contact leads.
- **[Hugging Face Scraper](https://apify.com/scrapesage/hugging-face-scraper)** — models, datasets, spaces & author leads.
- **[Product Hunt Scraper](https://apify.com/scrapesage/product-hunt-scraper)** — launches, makers & leads.

### Tips

- **Exhaust a niche**: combine a `tag` (e.g. `woocommerce`) with `browse: "popular"` and a high `maxResults`, then filter with `minActiveInstalls`.
- **Best leads**: monetizing authors make the strongest B2B leads — sort by `leadScore` and filter `monetized: true` / `businessModel: "commercial"`.
- **Cost & speed**: turn off `fullDetails` for a quick scan of search-result fields; keep it on (default) for the complete record. Contact enrichment only runs for items that actually have a website.
- **Themes**: theme records always fetch full details (active installs, ratings, sections) regardless of `fullDetails`.

### FAQ

**Does it use the WordPress.org API?** Yes — the official, public, keyless directory API (`api.wordpress.org`). No login, no token, no browser.

**How do I scrape every plugin by one company?** Use `mode: "searchPlugins"` with their WordPress.org username in `authors` (e.g. `automattic`) — you'll get their whole portfolio.

**Where do the emails come from?** Never from WordPress.org (it doesn't publish emails). With `enrichContacts` on, the actor visits the author's own public website and extracts publicly listed contact details — the same thing a human visitor would see.

**How do I monitor new versions automatically?** Turn on `monitorMode`, set a unique `monitorKey`, and create a [Schedule](https://docs.apify.com/platform/schedules). Each run returns only the items that changed.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**A field is null — why?** Some plugins genuinely don't set a homepage, donate link, or business model. Fields are `null` only when the data doesn't exist, not because the scraper skipped them.

**Is scraping WordPress.org legal?** This actor collects publicly available directory data only. You are responsible for using the data in compliance with applicable laws (GDPR/CCPA for personal data) and WordPress.org's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

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

Choose plugins or themes, and whether to search/browse the directory or fetch specific items by slug/URL.

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

Keywords to search the directory, e.g. <code>seo</code>, <code>woocommerce payments</code>, <code>backup</code>, <code>contact form</code>. Each keyword is scraped separately. (Search / browse modes.)

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

Browse a curated directory list instead of (or in addition to) keywords. Used when no keyword/tag/author is given.

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

Directory tag slugs to browse, e.g. <code>woocommerce</code>, <code>security</code>, <code>gutenberg</code>, <code>seo</code>, <code>ecommerce</code>, <code>elementor</code>. (Search / browse modes.)

## `authors` (type: `array`):

WordPress.org author usernames (from <code>profiles.wordpress.org/\<username></code>) to list every plugin/theme they publish — great for competitor & acquisition intelligence and author leads. E.g. <code>automattic</code>, <code>wpengine</code>.

## `slugs` (type: `array`):

For the "Specific…" modes: slugs (<code>woocommerce</code>, <code>astra</code>) or full URLs (<code>https://wordpress.org/plugins/woocommerce/</code>).

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

Optional WordPress.org plugin/theme URLs to scrape directly, in addition to the above.

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

Maximum number of plugin/theme records to return across all queries.

## `fullDetails` (type: `boolean`):

Fetch the complete record for each item (contributors, version history, changelog, screenshots, business model, support stats). Turn off for a faster, lighter run that uses only search-result fields.

## `minActiveInstalls` (type: `integer`):

Only keep plugins/themes with at least this many active installs (great for filtering to established products).

## `minRating` (type: `integer`):

Only keep items with a rating at or above this value (WordPress ratings are on a 0–100 scale; 80 = 4 stars).

## `includeRawData` (type: `boolean`):

Attach the complete untouched WordPress.org API response under a <code>raw</code> field for power users. Increases item size.

## `enrichContacts` (type: `boolean`):

Crawl each item's author/homepage (up to 3 pages: home + contact/about) for contact emails, phone numbers and social links (LinkedIn, X/Twitter, Facebook, Instagram, YouTube, GitHub). WordPress.org never exposes emails — this turns plugin/theme authors into ready-to-contact leads.

## `monitorMode` (type: `boolean`):

Remember items across runs and only output ones that are NEW or whose version / active installs / last-updated date CHANGED since the previous run. Perfect for tracking competitor plugins. Works with Apify Schedules — schedule a run, get only the deltas.

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

Which field defines a "change" in monitor mode.

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

In monitor mode, output only items never seen in a previous run (ignore updates to known items).

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

Namespace for the monitor memory. Use a stable, unique value per monitoring job (e.g. <code>seo-plugins-watch</code>) so different watches don't share state.

## `maxConcurrency` (type: `integer`):

How many detail requests to run in parallel.

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

Proxy settings. The WordPress.org API is open and clean; the default Apify Proxy is more than enough and helps spread any per-IP rate limiting.

## Actor input object example

```json
{
  "mode": "searchPlugins",
  "searchQueries": [
    "seo"
  ],
  "browse": "",
  "maxResults": 100,
  "fullDetails": true,
  "minActiveInstalls": 0,
  "minRating": 0,
  "includeRawData": false,
  "enrichContacts": false,
  "monitorMode": false,
  "monitorField": "any",
  "onlyNew": false,
  "monitorKey": "default",
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped plugin and theme records as JSON items 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 = {
    "searchQueries": [
        "seo"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/wordpress-plugin-theme-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["seo"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/wordpress-plugin-theme-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "seo"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapesage/wordpress-plugin-theme-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/wordpress-plugin-theme-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/TbUAsv89QQ63BNFBx/builds/i5DHKVFqiwzQfHi9h/openapi.json
