# WordPress Showcase Scraper - Website Examples (`w3crawler/wordpress-showcase-scraper`) Actor

Extract public WordPress Showcase site names, website URLs, descriptions, categories, tags, screenshots, and web-design metadata.

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

## Pricing

from $2.99 / 1,000 showcase sites

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### What does WordPress Showcase Scraper do?

This Actor reads the public [WordPress.org Showcase](https://wordpress.org/showcase/) archive, search results, filters, and detail pages. It returns showcased site names, canonical Showcase URLs, linked website URLs/domains, descriptions, screenshots, categories, flavors, tags, countries, authors, publication labels, and bounded public design context.

The Actor uses direct HTTPS requests to `wordpress.org` only. It does not use a WordPress API, log in, crawl the linked websites, download screenshots, or perform mutations. Access failures, empty scopes, malformed responses, and invalid requests are recorded as explicit diagnostics.

### Why use WordPress Showcase Scraper?

Use the dataset for public website discovery, WordPress ecosystem research, design and category analysis, editorial research, portfolio benchmarking, and market intelligence. Normal rows retain public Showcase and linked-site metadata with source lineage. The Actor does not infer private contact details or make claims about ownership, technology beyond the public Showcase context, or outreach permission.

### How to use WordPress Showcase Scraper

1. Choose `archives` to browse, `search` to query, or `details` for named Showcase slugs.
2. For search mode, provide `query`; for details mode, provide one or more public Showcase slugs or URLs.
3. Optionally select a category, tag, or flavor filter for archive browsing.
4. Bound the run with `page` and `maxItems`; enable `includeDetails` for linked website and design metadata.
5. Keep `requestDelayMs` at or above the default for polite serial requests and inspect the `OUTPUT` run summary with the dataset.

### Input

`mode` accepts `archives`, `search`, or `details`. `query` applies to search mode. `filterType` and `filterSlug` select a public category, tag, or flavor path. `page` selects a bounded Showcase result page. `showcaseSlugs` accepts public Showcase slugs or URLs in details mode. `maxItems` caps records, `includeDetails` controls detail-page enrichment, `maxContentChars` bounds stored detail text, and `requestDelayMs` controls the minimum interval between direct source requests.

```json
{
  "mode": "archives",
  "filterType": "category",
  "filterSlug": "creative",
  "page": 1,
  "maxItems": 10,
  "includeDetails": true,
  "maxContentChars": 30000,
  "requestDelayMs": 500
}
```

```json
{
  "mode": "search",
  "query": "museum",
  "page": 1,
  "maxItems": 10,
  "includeDetails": true,
  "requestDelayMs": 500
}
```

```json
{
  "mode": "details",
  "showcaseSlugs": ["physics-world"],
  "maxItems": 1,
  "includeDetails": true,
  "maxContentChars": 12000,
  "requestDelayMs": 500
}
```

### Output

Dataset rows have `recordType: "wordpress-showcase-site"`, stable identity, public Showcase metadata, optional linked website/detail fields, and source timestamps. Run status and detail-request outcomes are kept in the `OUTPUT` key-value record. Saved site rows produce `status: "SUCCEEDED"`; later detail or summary-write issues set `dataStatus: "PARTIAL"`. A genuine empty search is `SUCCEEDED` with `dataStatus: "NO_RESULTS"`; a source failure before any site row is `FAILED` with `dataStatus: "FAILED"` and no diagnostic dataset row.

```json
{
  "recordId": "wordpress_showcase_site_physics-world",
  "recordType": "wordpress-showcase-site",
  "source": "wordpress_showcase_public_html",
  "provenance": "wordpress_org_showcase_html",
  "showcaseSlug": "physics-world",
  "showcaseName": "Physics World",
  "showcaseUrl": "https://wordpress.org/showcase/physics-world/",
  "websiteUrl": "https://physicsworld.com/",
  "websiteDomain": "physicsworld.com",
  "category": "Publication",
  "country": "United Kingdom",
  "scrapedAt": "2026-09-08T00:00:00.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data table

| Field | Description |
| --- | --- |
| `recordId`, `recordType` | Stable site identity and row type. |
| `showcaseSlug`, `showcaseName`, `showcaseUrl` | Public WordPress Showcase identity and canonical detail page. |
| `websiteUrl`, `websiteDomain` | Public linked website and normalized hostname when supplied by the Showcase page. |
| `showcaseDescription`, `showcaseAuthor`, `country`, `published` | Public detail-page descriptive and publication metadata. |
| `category`, `flavor`, `siteTags` | Public detail-page taxonomy labels. |
| `cardCategories`, `cardTags`, `cardFlavor`, `cardText` | Public archive-card metadata and normalized card text. |
| `screenshotUrl`, `detailImageUrls` | Public image URLs exposed by WordPress.org; images are not downloaded. |
| `detailText` | Bounded public detail context. |
| `source`, `provenance`, `sourceUrl`, `scrapedAt` | Extraction lineage and retrieval timestamp. |

The `OUTPUT` key-value record contains serialized JSON with scope, filters, request counts, stored-record counts, detail failures, diagnostics, final status, and generated-by metadata.

### Pricing / Cost estimation

Archive and search modes use one bounded listing request. Details mode uses one direct request per selected slug, and `includeDetails` can add one detail request per discovered card. `maxItems`, response-size limits, content limits, request delays, and timeouts keep resource use predictable. Your Apify plan determines the final platform cost.

### Tips or advanced options

Use details mode for repeatable monitoring of known Showcase slugs. Use search mode for a focused public phrase such as `museum`. Keep `includeDetails` disabled when card metadata is enough and speed matters. Keep the default request delay for larger runs. Showcase categories, labels, descriptions, linked sites, and screenshots are source snapshots and can change between runs.

### FAQ, disclaimers, and support

Only public WordPress.org Showcase HTML is in scope. The Actor does not crawl or evaluate linked websites, collect private contact information, or verify ownership. You are responsible for lawful use, terms compliance, robots guidance, and appropriate request rates. If the public page shape changes, the Actor emits a diagnostic rather than fabricating values. Use the Issues tab for feedback.

### Local verification

```bash
npm ci
npm test
npm run lint
apify validate-schema
apify run --purge --input-file test/inputs/default.json
npm run validate
```

# Actor input Schema

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

Public WordPress Showcase scope to read.

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

Public WordPress.org site search text; applies to mode=search.

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

Optional public Showcase category, tag, or flavor filter.

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

Slug for the selected category, tag, or flavor; for example creative, design, or wordpress.

## `page` (type: `integer`):

Public Showcase result page number.

## `showcaseSlugs` (type: `array`):

Public Showcase slugs or URLs such as physics-world; applies to mode=details.

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

Maximum Showcase records to emit, from 1 to 100.

## `includeDetails` (type: `boolean`):

Fetch each selected public Showcase detail page for website and design metadata.

## `maxContentChars` (type: `integer`):

Maximum normalized public Showcase description text stored per record.

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

Polite minimum delay between direct WordPress.org Showcase requests.

## Actor input object example

```json
{
  "mode": "archives",
  "query": "museum",
  "filterType": "none",
  "filterSlug": "creative",
  "page": 1,
  "showcaseSlugs": [
    "physics-world"
  ],
  "maxItems": 10,
  "includeDetails": true,
  "maxContentChars": 30000,
  "requestDelayMs": 500
}
```

# Actor output Schema

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

No description

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

Completion status, source diagnostics, request scope, and counts stored in OUTPUT.

# 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": "archives",
    "query": "museum",
    "filterType": "none",
    "filterSlug": "creative",
    "page": 1,
    "showcaseSlugs": [
        "physics-world"
    ],
    "maxItems": 10,
    "includeDetails": true,
    "maxContentChars": 30000,
    "requestDelayMs": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("w3crawler/wordpress-showcase-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": "archives",
    "query": "museum",
    "filterType": "none",
    "filterSlug": "creative",
    "page": 1,
    "showcaseSlugs": ["physics-world"],
    "maxItems": 10,
    "includeDetails": True,
    "maxContentChars": 30000,
    "requestDelayMs": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("w3crawler/wordpress-showcase-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": "archives",
  "query": "museum",
  "filterType": "none",
  "filterSlug": "creative",
  "page": 1,
  "showcaseSlugs": [
    "physics-world"
  ],
  "maxItems": 10,
  "includeDetails": true,
  "maxContentChars": 30000,
  "requestDelayMs": 500
}' |
apify call w3crawler/wordpress-showcase-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,w3crawler/wordpress-showcase-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/1GdY5cr9sEoJFMZMh/builds/5GQjZ2hCezhFsqVYq/openapi.json
