Plugin Pulse

Developer docs

API and MCP

Programmatic access and AI-agent access to Plugin Pulse's plugin intelligence: installs, history, health, ranking optimization, rivals, and news. Same numbers as the site, from our database.

Authentication

Keys are pp_live_… tokens. Send them on every request:

Authorization: Bearer pp_live_your_key_here

Each key has an hourly rate limit (default 1,000 requests/hour). REST responses include x-ratelimit-remaining. Hitting the limit returns 429.

Self-serve key issuance isn't live yet. Keys are issued to members. To request early access, join the waitlist on Premium or email [email protected].

REST API

Base URL: https://plugins.wpmayor.com. All endpoints require a Bearer key. Plugin objects use the field names below (snake_case).

GET /api/v1/plugin/{slug}

Current state for one plugin. Optionally include daily snapshots and install-band milestones.

Parameters

  • slug path, required WordPress.org plugin slug (e.g. contact-form-7).
  • history query, optional Set to 1 or true to include snapshots and milestones.
  • days query, optional History window when history=1. Default 365, max 1500.

Example request

curl "https://plugins.wpmayor.com/api/v1/plugin/contact-form-7" \
  -H "Authorization: Bearer pp_live_your_key_here"

Example response

{
  "plugin": {
    "slug": "contact-form-7",
    "name": "Contact Form 7",
    "author": "Takayuki Miyoshi",
    "category": "forms",
    "active_installs": 5000000,
    "downloaded": 380000000,
    "downloads_30d": 1200000,
    "momentum_ratio": 1.02,
    "rating": 84,
    "num_ratings": 2100,
    "adjusted_stars": 4.2,
    "support_threads": 40,
    "support_threads_resolved": 28,
    "version": "6.0",
    "requires": "6.0",
    "tested": "6.7",
    "requires_php": "7.4",
    "last_updated": "2026-01-15 12:00:00",
    "added": "2007-09-01",
    "health_overall": 88,
    "health_grade": "A",
    "integrity": "clean",
    "closed_date": null,
    "icon": "https://...",
    "last_crawled": "2026-07-18T08:00:00.000Z",
    "url": "https://plugins.wpmayor.com/plugin/contact-form-7",
    "wporg_url": "https://wordpress.org/plugins/contact-form-7/"
  },
  "generated_at": "2026-07-18T12:00:00.000Z"
}

GET /api/v1/plugins

Current state for up to 50 plugins in one call. Missing slugs return { slug, found: false }.

Parameters

  • slugs query, required Comma-separated plugin slugs (max 50).

Example request

curl "https://plugins.wpmayor.com/api/v1/plugins?slugs=contact-form-7,woocommerce" \
  -H "Authorization: Bearer pp_live_your_key_here"

Example response

{
  "generated_at": "2026-07-18T12:00:00.000Z",
  "plugins": [
    {
      "slug": "contact-form-7",
      "name": "Contact Form 7",
      "active_installs": 5000000,
      "health_grade": "A",
      "url": "https://plugins.wpmayor.com/plugin/contact-form-7"
    },
    {
      "slug": "woocommerce",
      "name": "WooCommerce",
      "active_installs": 5000000,
      "health_grade": "A",
      "url": "https://plugins.wpmayor.com/plugin/woocommerce"
    }
  ]
}

GET /api/v1/search

Plugins whose name or slug matches a term. Full serializePlugin objects.

Parameters

  • q query, required Search term (min 2 characters).
  • limit query, optional Max results. Default 20, max 50.

Example request

curl "https://plugins.wpmayor.com/api/v1/search?q=rss&limit=10" \
  -H "Authorization: Bearer pp_live_your_key_here"

Example response

{
  "query": "rss",
  "count": 10,
  "plugins": [
    {
      "slug": "wp-rss-aggregator",
      "name": "WP RSS Aggregator",
      "active_installs": 40000,
      "rating": 90,
      "health_grade": "A",
      "url": "https://plugins.wpmayor.com/plugin/wp-rss-aggregator"
    }
  ]
}

Plugin object fields

Every REST plugin payload (and MCP get_plugin) uses these names:

slug, name, author, category,
active_installs, downloaded, downloads_30d, momentum_ratio,
rating, num_ratings, adjusted_stars,
support_threads, support_threads_resolved,
version, requires, tested, requires_php,
last_updated, added,
health_overall, health_grade, integrity, closed_date,
icon, last_crawled,
url, wporg_url

With ?history=1, the single-plugin endpoint also returns snapshots (date, active_installs, downloaded, downloads_30d, rating, num_ratings, rank_position, health_overall) and milestones.

MCP server

Point Claude, Cursor, or any MCP client at Plugin Pulse and query plugins without opening the site. Transport is Streamable HTTP (JSON-RPC 2.0 over POST, application/json responses).

Endpoint

https://plugins.wpmayor.com/api/mcp

Auth: same Bearer key as the REST API (Authorization: Bearer pp_live_…). If your client can't set headers, you can pass ?key=pp_live_… on the URL. Missing or invalid credentials return JSON-RPC error with HTTP 401 (429 when rate-limited).

A browser GET on the endpoint returns a discovery blob (name, transport, tools list, auth hints).

Add to Claude / Cursor

Paste a config like this into your MCP client settings. Exact field names and UI labels vary by client; you need the URL plus an Authorization header with your key.

{
  "mcpServers": {
    "plugin-pulse": {
      "url": "https://plugins.wpmayor.com/api/mcp",
      "headers": {
        "Authorization": "Bearer pp_live_your_key_here"
      }
    }
  }
}

Tools

Seven tools today. Valuation, competitive alerts, and market-report tools are coming as more premium features ship.

search_plugins

Search the index by name or slug. Returns matching plugins with installs, ratings, and categories.

Params
query (string, required), limit (number, default 10, max 25)
Returns
{ query, count, plugins: [{ slug, name, active_installs, rating, num_ratings, category }] }

get_plugin

Full snapshot: installs, downloads, ratings, health, integrity, plus an estimated install band.

Params
slug (string, required)
Returns
{ plugin: serializePlugin, install_estimate, generated_at }

plugin_history

Daily history: installs, downloads, rating, directory rank, health, plus milestone band crossings.

Params
slug (string, required), days (number, default 365, max 1500)
Returns
{ slug, days, snapshots: [{ date, active_installs, downloaded, rating, rank_position, health_overall }], milestones }

ranking_optimization

How well a listing is tuned for wp.org search on factors the owner controls. Overall 0-100, factor breakdown, top fix.

Params
slug (string, required)
Returns
{ slug, overall, factors: [{ key, label, score, weight, hint }], topFix }

closure_risk

Maintenance and integrity risk signals that often precede a wp.org closure. Score 0-100 with level low/elevated/high.

Params
slug (string, required)
Returns
{ slug, score, level, factors, integrity }

competitors

Closest rival plugins, ranked by shared wp.org tags then install reach.

Params
slug (string, required), limit (number, default 6, max 20)
Returns
{ slug, count, competitors: [{ slug, name, active_installs, health_grade, health_overall, adjusted_stars, shared_tags }] }

latest_news

Recent release notes and news from the best source (blog RSS, GitHub releases, or wp.org changelog).

Params
slug (string, required), limit (number, default 6, max 25)
Returns
{ slug, count, items: [{ title, url, version, summary, published, source }] }

Example: tools/call

Call ranking_optimization for a plugin:

curl -X POST "https://plugins.wpmayor.com/api/mcp" \
  -H "Authorization: Bearer pp_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "ranking_optimization",
      "arguments": { "slug": "contact-form-7" }
    }
  }'

Trimmed result (tool payload is JSON text inside MCP content blocks):

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\n  \"slug\": \"contact-form-7\",\n  \"overall\": 86,\n  \"factors\": [\n    { \"key\": \"freshness\", \"label\": \"Update recency\", \"score\": 100, \"weight\": 25, \"hint\": \"...\" },\n    { \"key\": \"compatibility\", \"label\": \"WP compatibility\", \"score\": 90, \"weight\": 20, \"hint\": \"...\" }\n  ],\n  \"topFix\": null\n}"
      }
    ]
  }
}

Rate limits and support

Default limit is 1,000 requests per key per hour. REST responses set x-ratelimit-remaining; over the limit returns 429. MCP rate limits use the same per-key window.

Questions or key requests: [email protected]. For membership and early access, see Plugin Pulse Premium.

Data from the public WordPress.org APIs plus our daily crawl and historical archive. Not affiliated with WordPress.org.