Catalog/pm-earned-value

Calculators

Earned-value analysis (CPI/SPI/CV/SV) API

Compute the canonical PMI/PMBOK earned-value metrics from PV, EV, AC — CV = EV-AC, SV = EV-PV, CPI = EV/AC, SPI = EV/PV — with percent variances, over-budget/behind-schedule flags, a health bucket, and a per-metric breakdown. Deterministic ratios LLMs get subtly wrong. Answers 'what is my CPI and SPI','is this project over budget','how far behind schedule am I','give me the earned-value breakdown'.

Price$0.01per request
MethodPOST
Route/v1/calc/pm-earned-value
StatusLive
MIME typeapplication/json
Rate limit120/minute
CacheNo cache
calcpmearned-valueevmcpispivarianceproject
API URLhttps://x402.hexl.dev/v1/calc/pm-earned-value
Integration docs
Example request
{
  "plannedValue": 1000,
  "earnedValue": 800,
  "actualCost": 1000
}
Example response
{
  "plannedValue": 1000,
  "earnedValue": 800,
  "actualCost": 1000,
  "costVariance": -200,
  "scheduleVariance": -200,
  "costVariancePct": -25,
  "scheduleVariancePct": -20,
  "cpi": 0.8,
  "spi": 0.8,
  "overBudget": true,
  "behindSchedule": true,
  "status": "at-risk",
  "breakdown": [
    {
      "metric": "CV = EV - AC",
      "value": -200
    },
    {
      "metric": "SV = EV - PV",
      "value": -200
    },
    {
      "metric": "CPI = EV / AC",
      "value": 0.8
    },
    {
      "metric": "SPI = EV / PV",
      "value": 0.8
    }
  ]
}
Input schema
{
  "type": "object",
  "required": [
    "plannedValue",
    "earnedValue",
    "actualCost"
  ],
  "properties": {
    "plannedValue": {
      "type": "number",
      "description": "PV / BCWS, budgeted cost of work scheduled",
      "examples": [
        1000
      ]
    },
    "earnedValue": {
      "type": "number",
      "description": "EV / BCWP, budgeted cost of work performed",
      "examples": [
        800
      ]
    },
    "actualCost": {
      "type": "number",
      "description": "AC / ACWP, actual cost of work performed",
      "examples": [
        1000
      ]
    }
  }
}
Output schema
{
  "type": "object",
  "additionalProperties": true
}