# Ghost CMS Theme Scraper: Price, Rating & Author Data as JSON (`getascraper/ghost-themes-scraper`) Actor

Scrape the official Ghost CMS theme marketplace into structured JSON: name, category, pricing tier, price, author, star rating, thumbnail, plus optional demo and purchase or GitHub links. Filter by category, price, author, or rating; the marketplace has no bulk export. $1.80 per 1,000 themes.

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

## Pricing

from $1.35 / 1,000 theme records

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

## 🎨 Ghost Themes Scraper

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#F5F3FF;border:1px solid #DDD6FE;border-top:4px solid #6D28D9;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Every Ghost marketplace theme, compared in one run</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Get name, category, price, author, and star rating for every theme on the official Ghost CMS marketplace in one structured dataset, plus optional live demo and purchase links.</span>
</td>
</tr>
</table>
<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #DDD6FE;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#5B21B6">🎨 Full catalog, one run</span><br>
<span style="font-size:12px;color:#57534E">Every theme currently listed on the marketplace, not a sample page.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #DDD6FE;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#5B21B6">💰 Price and rating together</span><br>
<span style="font-size:12px;color:#57534E">Compare cost against star rating without opening a single theme page.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #DDD6FE;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#5B21B6">🔗 Demo and purchase links</span><br>
<span style="font-size:12px;color:#57534E">Optional enrichment adds the live preview plus the buy or download link.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #DDD6FE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#5B21B6">🎯 Filter as you go</span><br>
<span style="font-size:12px;color:#57534E">Narrow by category, pricing tier, or minimum rating before you download.</span>
</td>
</tr>
</table>

Picking a theme for a new [Ghost](https://ghost.org) publication usually means clicking through the [marketplace](https://ghost.org/themes/) one card at a time. **Ghost Themes Scraper** reads the whole catalog in a single run and hands it back as a structured dataset you can sort, filter, and compare.

### 🔍 What does Ghost Themes Scraper do?

It reads the official Ghost theme marketplace at [ghost.org/themes](https://ghost.org/themes/) and returns one row per theme: name, category, pricing tier, price, author or studio name, star rating, and a preview thumbnail. Turn on the optional detail mode and it also fetches each theme's live demo link, plus its purchase link for paid themes or its direct source download link for free official themes.

Run it on the Apify platform to schedule repeat checks, pull results through the API, or export straight to JSON, CSV, or Excel, no manual browsing required.

### 👥 Why use it?

**Picking a theme for a new publication?** Compare price, rating, and category across the entire marketplace in one table instead of clicking through 242 individual cards.

**Running a Ghost theme studio?** Pull every competing theme's price and rating in one run to see exactly where your own pricing sits in the market.

**Building a directory or roundup post?** Get structured theme data, ready to filter and publish, instead of manually copying details off each listing page.

### 🚀 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#F5F3FF;border:1px solid #DDD6FE;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#6D28D9;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Set your filters</span><br>
<span style="font-size:12px;color:#57534E">Pick a category, free or paid, and a minimum rating, or leave everything blank.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F5F3FF;border:1px solid #DDD6FE;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#6D28D9;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run the Actor</span><br>
<span style="font-size:12px;color:#57534E">It reads the marketplace once and matches every theme against your filters.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F5F3FF;border:1px solid #DDD6FE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#6D28D9;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Get your dataset</span><br>
<span style="font-size:12px;color:#57534E">Download results as JSON, CSV, or Excel, ready to sort and compare.</span>
</td>
</tr>
</table>

### ⚙️ Input

| Field | Type | Required | Description |
|---|---|---|---|
| `category` | enum | No | Only return themes in this category: Blog, Magazine, Newsletter, Portfolio, News, Podcast, Photography, or Docs. Leave blank for every category. |
| `pricingTier` | enum | No | Only return free themes, only paid themes, or leave blank for both. |
| `minRating` | enum | No | Only return themes rated at least this many stars: 3, 4, or 5. Leave blank for any rating. |
| `maxItems` | integer | No | Maximum number of matching themes to return. The full marketplace is around 242 themes; raise this to pull the entire catalog in one run. |
| `fetchDetails` | boolean | No | When enabled, fetches each matched theme's live demo link and its purchase link (paid themes) or source download link (free official themes). Off by default since it adds one extra request per theme. |
| `proxyConfiguration` | object | No | Proxy settings. The default works for virtually every run. |

### 📦 Output

Each result includes the fields below. `price`, `currency`, and `authorName` are omitted for themes where the marketplace itself has nothing to show (for example, an official free theme has no separate price). The `demoUrl`, `buyUrl`, and `githubDownloadUrl` fields only appear when `fetchDetails` is enabled.

```json
{
  "name": "Society",
  "slug": "society",
  "themeUrl": "https://ghost.org/themes/society/",
  "category": "News",
  "pricingTier": "paid",
  "price": 149,
  "currency": "USD",
  "authorName": "Themes by Kyle",
  "rating": 5,
  "thumbnailUrl": "https://ghost.org/images/marketplace/themes/society.png",
  "demoUrl": "https://society.themesbykyle.com",
  "buyUrl": "https://themesbykyle.gumroad.com/l/society",
  "scrapedAt": "2026-09-28T12:00:00.000Z"
}
```

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

#### Data table

| Field | Type | Description |
|---|---|---|
| `name` | string | Theme name. |
| `slug` | string | The theme's marketplace URL slug. |
| `themeUrl` | string | Link to the theme's page on the Ghost marketplace. |
| `category` | string | Marketplace category. |
| `pricingTier` | string | `free` or `paid`. |
| `price` | number | Price in USD. Omitted for free themes. |
| `currency` | string | Always `USD` when a price is present. |
| `authorName` | string | Theme author or studio name. |
| `rating` | number | Star rating shown on the marketplace (3, 4, or 5). |
| `thumbnailUrl` | string | Preview thumbnail image URL. |
| `demoUrl` | string | Live demo link. Present only when detail enrichment is enabled. |
| `buyUrl` | string | External purchase link for paid themes. Present only when detail enrichment is enabled. |
| `githubDownloadUrl` | string | Direct source download link for free official themes. Present only when detail enrichment is enabled. |
| `scrapedAt` | string | Timestamp of when the row was scraped. |

### 💰 Pricing

Ghost Themes Scraper runs on Apify's pay-per-event model. You only pay for what the Actor actually delivers, an empty run costs nothing, and there is no subscription. Free-plan runs are limited to 25 themes per run, 3 runs per day, and a short wait between runs; upgrade to a paid Apify plan for unrestricted access.

### ⭐ Enjoying Ghost Themes Scraper?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#F5F3FF;border:1px solid #DDD6FE;border-left:5px solid #6D28D9;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">Saved yourself an afternoon of clicking through theme cards?</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other publishers and theme shoppers find this Actor. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#6D28D9;border:1px solid #DDD6FE;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/ghost-themes-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>

### 💡 Tips

- Leave every filter blank and raise `maxItems` to around 250 to pull the entire marketplace in a single run.
- Only turn on `fetchDetails` when you actually need the demo or purchase links. It roughly doubles the number of requests, so skip it for a quick price or rating comparison.
- Run it on a schedule if you want to track when new themes are added or prices change, since each run reads the marketplace fresh.

### ❓ FAQ

**How many themes does this cover?**
Every theme currently listed on the official Ghost marketplace, around 242 as of this writing. Each run reads the live page, so the count reflects whatever is listed at run time.

**Does this include the demo and purchase links by default?**
No. Turn on the "Fetch demo & purchase links" option to add them. It's off by default because it takes one extra request per theme.

**Can I filter to just free themes, or just one category?**
Yes. Combine the category, pricing tier, and minimum rating filters to narrow results before you download.

**Will this keep working if Ghost redesigns the marketplace page?**
It reads the page's current structure, so a significant redesign could require an update. If a run ever returns unexpectedly few results, open an issue in the Actor's Issues tab.

### 🔗 Other actors

- [Newsletter Sponsor Intelligence](https://apify.com/getascraper/newsletter-sponsor-intelligence) ↗ - Extracts sponsors and ad placements from Substack, beehiiv, and Ghost newsletters.
- [Technical SEO Audit & Indexability Checker](https://apify.com/getascraper/seo-release-indexability-guard) ↗ - Checks a site's indexability and technical SEO health after every release.
- [Shopify product scraper](https://apify.com/getascraper/shopify-store-product-monitor) ↗ - Monitors a Shopify store's product catalog for changes.
- [Website Action Stack Detector: Public Signals](https://apify.com/getascraper/website-action-stack-detector) ↗ - Detects the public tools and integrations a website runs on.
- [Website Technology Change Monitor: Tech Signals](https://apify.com/getascraper/website-technology-change-monitor) ↗ - Tracks when a website's technology stack changes over time.

# Changelog

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

# Actor input Schema

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

Only return themes tagged with this category on the marketplace. Leave blank to return themes from every category.

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

Only return free themes, only paid themes, or both.

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

Only return themes credited to an author or studio whose name contains this text (case-insensitive, e.g. "Kyle" matches "Themes by Kyle"). Useful for pulling every theme from one well-known theme shop. Leave blank to include themes from every author.

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

Only return themes with at least this star rating. Themes on this marketplace are rated 3, 4, or 5 stars, so this matches the site's own rating filter.

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

Maximum number of matching themes to scrape. The full marketplace is around 242 themes; raise this if you want the entire catalog in one run.

## `fetchDetails` (type: `boolean`):

When enabled, makes one extra request per matched theme to its detail page to collect the live demo URL and either the external purchase link (paid themes) or the GitHub source download link (free official themes). Slower and more requests, so it defaults off.

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

The marketplace is a static, publicly served marketing site with no IP-quality gating, so the default datacenter proxy group works reliably. Only change this if you are running many concurrent Actors from the same proxy pool.

## Actor input object example

```json
{
  "category": "",
  "pricingTier": "",
  "authorName": "",
  "minRating": "0",
  "maxItems": 25,
  "fetchDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `themes` (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 = {
    "category": "",
    "pricingTier": "",
    "authorName": "",
    "minRating": "0",
    "maxItems": 25,
    "fetchDetails": false,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/ghost-themes-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 = {
    "category": "",
    "pricingTier": "",
    "authorName": "",
    "minRating": "0",
    "maxItems": 25,
    "fetchDetails": False,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/ghost-themes-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 '{
  "category": "",
  "pricingTier": "",
  "authorName": "",
  "minRating": "0",
  "maxItems": 25,
  "fetchDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/ghost-themes-scraper --silent --output-dataset

```

## MCP server setup

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