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
- Wait until the plugin accumulates user ratings on the marketplace, then re-render the badge.
- Use the downloads or version badge instead of the rating badge for unrated plugins.
- 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
- For new plugins prefer the downloads or version badge until ratings exist
- Show 'unrated' as a graceful placeholder in dashboards
- Confirm the pluginId is correct — a wrong id can resolve to an unrated entry
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.