badges/shields · warning · NotFound

No Plugin Ratings

Error message

No Plugin Ratings

What it means

The JetBrains plugin rating service throws NotFound with 'No Plugin Ratings' when the aggregated voteCount is 0, i.e. the plugin has zero user votes in the marketplace data. With no votes there is no meaningful rating to render (the Bayesian formula would just return meanRating). It indicates a real but empty-data condition rather than a lookup failure.

Source

Thrown at services/jetbrains/jetbrains-rating.service.js:102

      const jetbrainsPluginData = await this._requestJson({
        schema: jetbrainsSchema,
        url: `https://plugins.jetbrains.com/api/plugins/${this.constructor._cleanPluginId(
          pluginId,
        )}/rating`,
        httpErrors: { 400: 'not found' },
      })

      let voteSum = 0
      let voteCount = 0
      const votes = jetbrainsPluginData.votes
      Object.entries(votes).forEach(([rating, votes]) => {
        voteSum += parseInt(rating) * votes
        voteCount += votes
      })
      const meanRating = jetbrainsPluginData.meanRating

      if (voteCount === 0) {
        throw new NotFound({ prettyMessage: 'No Plugin Ratings' })
      }

      // JetBrains Plugin Rating Formula from:
      // https://plugins.jetbrains.com/docs/marketplace/plugins-rating.html
      rating = (voteSum + 2 * meanRating) / (voteCount + 2)
    }

    return this.constructor.render({ rating, format })
  }
}

View on GitHub (pinned to 766fd8bc89)

Solutions

  1. Wait until the plugin accumulates user ratings on the marketplace, then re-render the badge.
  2. Use the downloads or version badge instead of the rating badge for unrated plugins.
  3. Verify the pluginId is correct — a wrong id may resolve to an empty/unrated repository entry.
Defensive patterns

Strategy: fallback

Validate before calling

// Check the marketplace API for existing ratings before rendering the rating badge:
const res = await fetch(`https://plugins.jetbrains.com/api/plugins/${pluginId}/reviews`);
const reviews = await res.json();
if (!Array.isArray(reviews) || reviews.length === 0) console.warn('plugin has no ratings yet');

Type guard

function hasRatings(ratingEntries) {
  return Array.isArray(ratingEntries) && ratingEntries.reduce((n, e) => n + (e.votes || 0), 0) > 0;
}

Try / catch

try {
  badge = await getJetBrainsRatingBadge(pluginId);
} catch (e) {
  if (e.name === 'NotFound') {
    badge = renderBadge('rating', 'unrated');
  } else throw e;
}

Prevention

When it happens

Trigger: Requesting /jetbrains/plugin/r/<pluginId> for a plugin whose fetched ratings XML yields no rating entries, so the votes accumulation loop adds nothing and voteCount stays 0.

Common situations: Brand-new plugin with no user reviews yet; very obscure plugin nobody has rated; pluginId resolving to a plugin whose rating data was wiped after republication.

Related errors


AI-assisted analysis of badges/shields@766fd8bc89 (2026-08-30). Data as JSON: /api/errors/cbcb211c46628541. Report an issue: GitHub.