Skip to content

Fix ETAs

Get predicted fix timelines for all open CVEs. Estimates are based on multiple signals including severity, upstream fix availability, assignee status, linked PRs, package health, issue age, and comment activity.

Endpoint

GET /api/v1/fix-etas

Response

json
{
  "success": true,
  "data": {
    "predictions": {
      "CVE-2025-1234": {
        "estimatedDays": 14,
        "confidence": 55,
        "etaDate": "2026-02-24",
        "range": {
          "low": "2026-02-17",
          "high": "2026-03-10"
        },
        "factors": [
          {
            "signal": "high_severity",
            "impact": "accelerator",
            "detail": "High severity increases urgency"
          },
          {
            "signal": "upstream_fix_available",
            "impact": "strong_accelerator",
            "detail": "Upstream fix exists - version bump likely"
          }
        ],
        "package": "openssl",
        "issueNumber": 42
      }
    },
    "totalPredicted": 25,
    "summary": {
      "within7Days": 5,
      "within30Days": 15,
      "within90Days": 22,
      "beyond90Days": 3
    },
    "lastUpdated": "2026-02-10T12:00:00.000Z"
  },
  "timestamp": "2026-02-10T12:00:00.000Z"
}

Response Fields

Per-CVE Prediction

FieldTypeDescription
estimatedDaysnumberPredicted days until fix (1-180)
confidencenumberConfidence percentage (10-90%)
etaDatestringPredicted fix date (ISO date)
range.lowstringOptimistic estimate date
range.highstringPessimistic estimate date
factorsarraySignals that influenced the prediction
packagestringAffected package name
issueNumbernumberGitHub issue number

Prediction Factors

SignalImpactDescription
critical_severitystrong_acceleratorCritical CVEs get prioritized (0.4x time)
high_severityacceleratorHigh severity increases urgency (0.6x)
upstream_fix_availablestrong_acceleratorUpstream fix exists (0.4x)
assignedacceleratorIssue has an assignee (0.5x)
linked_prstrong_acceleratorPR already exists (capped at 7 days)
orphaned_packagestrong_deceleratorNo maintainer (2x time)
active_maintainersacceleratorMultiple maintainers (0.8x)
stale_issuedeceleratorOpen > 60 days (1.3x)
active_discussionaccelerator5+ comments (0.8x)

Summary

FieldTypeDescription
within7DaysnumberCVEs predicted to be fixed within 7 days
within30DaysnumberCVEs predicted to be fixed within 30 days
within90DaysnumberCVEs predicted to be fixed within 90 days
beyond90DaysnumberCVEs predicted to take longer than 90 days

Example

bash
curl https://api.vulnpatch.dev/api/v1/fix-etas

Code Examples

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

  // CVEs likely to be fixed soon
  const soonFixes = Object.entries(data.predictions)
    .filter(([, p]) => p.estimatedDays <= 7 && p.confidence >= 50)
    .sort((a, b) => a[1].estimatedDays - b[1].estimatedDays);

  console.log(`Expected fixes this week: ${soonFixes.length}`);
  soonFixes.forEach(([cve, p]) => {
    console.log(`  ${cve} (${p.package}): ~${p.estimatedDays}d, ${p.confidence}% confidence`);
  });
}
python
import requests

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

print(f"Summary: {data['summary']}")

# Stuck CVEs (high estimate, low confidence)
stuck = {cve: p for cve, p in data["predictions"].items()
         if p["estimatedDays"] > 90 and p["confidence"] < 30}

for cve, p in stuck.items():
    factors = ", ".join(f["signal"] for f in p["factors"] if "decelerator" in f["impact"])
    print(f"  {cve}: ~{p['estimatedDays']}d - blockers: {factors}")

Use Cases

  • Sprint planning: Know which CVEs are likely to be fixed soon
  • Escalation: Identify CVEs with long ETAs that may need intervention
  • Reporting: Provide stakeholders with estimated remediation timelines
  • Prioritization: Focus on CVEs where a fix is imminent vs. stalled

Caching

Predictions are computed every 30 minutes via cron.

Helping secure open source