Everything you need to integrate RepoVital into your workflow.
All requests to /score require an API key passed in the X-API-Key header.
The /badge and /health endpoints do not require authentication.
Base URL: https://api.repovital.com
X-API-Key
| Param | Type | Required | Description |
|---|---|---|---|
repo | string | Yes | Full GitHub URL, e.g. https://github.com/django/django |
| Field | Type | Description |
|---|---|---|
repo | string | Canonical owner/name identifier |
score | int or null | 0–100 health score; null for Unscored repos |
tier | string | Healthy / Watch / At Risk / Critical / Archived / Unscored |
scorer_version | string | Which scoring path ran — see scorer_version table below |
scored_at | ISO 8601 datetime | When the score was computed (cached for 24 hours) |
archived | bool | True if the repo is archived on GitHub |
fork | bool | True if the repo is a fork; forks score low due to low independent activity |
message | string or null | Human-readable explanation for special tiers (Archived, Unscored) |
top_signals | array | Top SHAP-ranked signals driving the score, each with name, value, direction, label |
features | object | All 9 raw feature values used by the model |
Returns an SVG badge showing the repo's health tier. Designed to be embedded in README files.
| Param | Type | Required | Description |
|---|---|---|---|
repo | string | Yes | Full GitHub URL of the repository |
OWNER/REPO, and paste into your README.This is a live badge for django/django:
X-API-Key or ?key=
View your current tier, daily usage, and manage your subscription. Returns an HTML page, not JSON.
| Method | Example |
|---|---|
| Header | X-API-Key: rv_your_key_here |
| Query param | ?key=rv_your_key_here |
| Field | Description |
|---|---|
| Tier | Your current plan (Free, Pro, Team, Business, or Enterprise) |
| Daily usage | Requests used today vs. your daily limit |
| API key | Partially masked key, e.g. rv_1pEO…fJg |
| Subscription | Link to the Stripe Customer Portal to manage or cancel |
Every scored repository falls into one tier. The ML model outputs a probability (0–1) which is multiplied by 100 to produce the score. A rules-based fallback applies the same thresholds to a weighted feature sum.
| Tier | Score range | Meaning |
|---|---|---|
| Healthy | 72–100 | Actively maintained |
| Watch | 50–71 | Some maintenance signals weakening |
| At Risk | 28–49 | Multiple signals declining |
| Critical | 0–27 | High abandonment risk |
| Tier | Score | Condition |
|---|---|---|
| Archived | 0 | Repo is archived on GitHub |
| Unscored | null | Repo <6 months old or has zero commits |
RepoVital measures nine features for each repository.
| Signal | What it measures | Why it matters |
|---|---|---|
commit_velocity_slope |
Slope of weekly commit count over the trailing 12 months (positive = accelerating, negative = decelerating) | A negative slope predicts future inactivity even when the repo looks active today |
contributor_gini |
Gini coefficient of commit counts across all contributors (0 = equal, 1 = one person did everything) | High concentration in one contributor is fragile — bus factor risk |
days_since_last_commit |
Calendar days since the most recent commit | The single strongest abandonment signal — a repo with no recent commits is likely unmaintained |
has_governance_docs |
Whether the repo has CONTRIBUTING, CODE_OF_CONDUCT, or SECURITY files | Governance docs correlate weakly with health; flag is low signal on its own |
issue_response_p50 |
Median hours until the first maintainer comment on a new issue | Fast response time indicates engaged maintainers; currently sparse in training data |
open_issue_age_p75 |
75th percentile age (in days) of currently open issues | A large backlog of old open issues signals the maintainer has lost bandwidth |
pr_merge_rate |
Fraction of recently closed pull requests that were merged (vs. closed without merging) | High merge rate indicates an active, accepting maintainer — low rate suggests a stalled queue |
release_cadence_cv |
Coefficient of variation of time intervals between releases (tags + GitHub Releases combined) | Low CV = regular, predictable releases; high CV = erratic or stopped shipping |
repo_age_days |
Days since the repository was created | Older repos have more track record to judge; very new repos are excluded from scoring |
Limits are enforced per API key per calendar day (UTC). Every /score response includes rate limit headers.
| Tier | Scores/day | Price |
|---|---|---|
| Free | 10 | $0 — no credit card required |
| Pro | 100 | $9/month |
| Team | 1,000 | $29/month |
| Business | 10,000 | $79/month |
| Enterprise | Unlimited | Contact [email protected] |
10 for free tier)
When you exceed your daily limit, you receive a 429 with an upgrade_url field pointing to repovital.com/#pricing.
Every score response includes a scorer_version string that tells you exactly which scoring path ran.
| Value | Tier | Meaning |
|---|---|---|
ml-v1 |
Healthy / Watch / At Risk / Critical | ML model scored successfully |
rules-v1 |
Healthy / Watch / At Risk / Critical | ML failed; rules-based fallback applied |
rules-v1-archived |
Archived | Repo is archived on GitHub; pre-filter applied before feature extraction |
rules-v1-new-repo |
Unscored | Repo is less than 6 months old; insufficient signal to score reliably |
rules-v1-insufficient-data |
Unscored | Repo has zero commits; no feature data available |
Some repositories produce non-standard responses. Here is what to expect for each case.
GitHub marks a repo archived when the owner freezes it. RepoVital hard-filters these before feature extraction.
Repos under 6 months old or with zero commits lack enough signal for the ML model to produce a reliable result. score is null.
If GitHub returns 403 or 404 for the requested repo, you get a clean HTTP 404 (never a 500).
Forks score low because they have little independent activity relative to their upstream. The score is not overridden — the low number is the correct answer. The fork: true flag in the response helps callers add context in their UI.