Skip to content

Package Health

Get maintenance health scores for tracked packages. Scores reflect maintainer activity, orphan status, historical fix velocity, and open issue count.

Endpoints

GET /api/v1/package-health
GET /api/v1/package-health/:name

Response (All Packages)

json
{
  "success": true,
  "data": {
    "packages": {
      "openssl": {
        "score": 85,
        "grade": "A",
        "isOrphaned": false,
        "maintainerCount": 3,
        "avgFixDays": 8.5,
        "openIssueCount": 2
      },
      "libsoup_3": {
        "score": 35,
        "grade": "D",
        "isOrphaned": true,
        "maintainerCount": 0,
        "avgFixDays": null,
        "openIssueCount": 4
      }
    },
    "totalPackages": 45,
    "orphanedCount": 8,
    "distribution": {
      "A": 10,
      "B": 15,
      "C": 10,
      "D": 5,
      "F": 5
    }
  },
  "timestamp": "2026-02-10T12:00:00.000Z"
}

Response Fields

Per-package Data

FieldTypeDescription
scorenumberHealth score 0-100
gradestringLetter grade: A (80+), B (60+), C (40+), D (20+), F (0-19)
isOrphanedbooleanWhether the package has no known maintainer
maintainerCountnumberNumber of active maintainers
avgFixDaysnumber|nullHistorical average days to fix CVEs
openIssueCountnumberCurrently open security issues

Summary Fields

FieldTypeDescription
totalPackagesnumberTotal packages with health data
orphanedCountnumberPackages with no maintainer
distributionobjectCount of packages by grade

Single Package

bash
curl https://api.vulnpatch.dev/api/v1/package-health/openssl

Returns the health data for the specified package, or null if not tracked.

Example

bash
# All packages
curl https://api.vulnpatch.dev/api/v1/package-health

# Single package
curl https://api.vulnpatch.dev/api/v1/package-health/openssl

Code Examples

javascript
async function getOrphanedPackages() {
  const response = await fetch('https://api.vulnpatch.dev/api/v1/package-health');
  const { data } = await response.json();

  const orphaned = Object.entries(data.packages)
    .filter(([, pkg]) => pkg.isOrphaned)
    .sort((a, b) => b[1].openIssueCount - a[1].openIssueCount);

  console.log(`Orphaned packages: ${orphaned.length}`);
  orphaned.forEach(([name, pkg]) => {
    console.log(`  ${name}: ${pkg.openIssueCount} open issues, grade ${pkg.grade}`);
  });
}
python
import requests

response = requests.get("https://api.vulnpatch.dev/api/v1/package-health")
data = response.json()["data"]

orphaned = {name: pkg for name, pkg in data["packages"].items() if pkg["isOrphaned"]}
print(f"Orphaned: {len(orphaned)} / {data['totalPackages']}")

for name, pkg in sorted(orphaned.items(), key=lambda x: x[1]["openIssueCount"], reverse=True):
    print(f"  {name}: {pkg['openIssueCount']} issues, grade {pkg['grade']}")

Use Cases

  • Maintainer recruitment: Identify orphaned packages that need adoption
  • Risk assessment: Factor maintenance health into vulnerability prioritization
  • Reporting: Track package ecosystem health over time

Caching

Data is computed every 30 minutes via cron.

Helping secure open source