Skip to content

Fix ETAs ​

Get predicted fix timelines for all open CVEs.

Closed nixpkgs security issues are excluded: a predicted fix date for work already finished is not a prediction. 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.