Get contract burndown
curl --request GET \
--url https://api.nops.io/v1/contract-tracker/{id}/burndown \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.nops.io/v1/contract-tracker/{id}/burndown"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.nops.io/v1/contract-tracker/{id}/burndown', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.nops.io/v1/contract-tracker/{id}/burndown"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"data": {
"data": {
"Amazon EC2": {
"granular": {
"2025-12-01": 41250.12,
"2026-01-01": 43980.55,
"2026-02-01": 44100
},
"total": 129330.67,
"isMarketplace": false,
"forecastBounds": {
"2026-02-01": {
"lo80": 40100,
"hi80": 48200,
"lo95": 38000,
"hi95": 50300
}
}
},
"Datadog (AWS Marketplace)": {
"granular": {
"2025-12-01": 1500,
"2026-01-01": 1500,
"2026-02-01": 1500
},
"total": 4500,
"isMarketplace": true
}
},
"forecastMonths": [
"2026-02-01"
],
"forecastModel": "RWD",
"projectedBreachDate": null,
"currentMonthActuals": {
"2026-02-01": 18240.3
},
"periods": [
{
"key": "2025",
"label": "Year 1",
"dateRange": "Dec 2025 - Nov 2026",
"actualSpend": 106971.97,
"projectedSpend": 490028.03,
"projectedEnd": 597000,
"projectedShortfall": 403000,
"projectedMeetMonth": null,
"projectedRange": {
"low": 512400,
"high": 681600
},
"meetChance": 0,
"target": 1000000,
"paceTarget": 249315.07,
"variance": -142343.1,
"status": "Behind",
"outcome": "Likely to miss",
"isComplete": false,
"isUsageBased": false
}
],
"savings": {
"edpSavings": 10346.45,
"privateRateSavings": 0,
"eligibleSpend": 129330.67,
"realizedEdpRate": 8,
"projectedEdpSavings": 46680,
"periods": [
{
"key": "2025",
"label": "Year 1",
"edpSavings": 10346.45,
"privateRateSavings": 0,
"eligibleSpend": 129330.67,
"realizedEdpRate": 8,
"projectedEdpSavings": 46680
}
]
},
"scopeRestricted": false
}
}{
"error": {
"code": "forbidden_scope",
"message": "API key is missing required scope: budgets:write",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "forbidden_scope",
"message": "API key is missing required scope: budgets:write",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Contract tracker
Get contract burndown
Commitment attainment for a contract, counted before the EDP discount (unblended cost, or usage amount for usage-based contracts).
data: spend per series.granularis keyed by segment start, the later of the month start and the contract period start, so a period starting mid-month splits that month into two keys.isMarketplacemarks series billed by AWS Marketplace, which the Marketplace cap applies to.forecastBoundsholds prediction intervals for forecast months.forecastMonths: month keys whose values come from the forecast model.currentMonthActuals: current month spend to date, keyed by segment, summed across series with the Marketplace cap applied.periods: per period attainment:actualSpend(includes the current month to date),projectedSpend(forecast still to come),projectedEnd,projectedShortfall(target minus projected end, floored at 0),projectedMeetMonth,projectedRange,meetChance,target,paceTarget,variance,status,outcomeandisComplete.projectedRange(low,high) is where the period likely ends: the 10th to 90th percentile of simulated outcomes, sized from the forecast’s past error, never belowactualSpendand with counted Marketplace spend capped.meetChance(0 to 1) is the chance the period reaches its target; both are null for a finished period or without a forecast, andmeetChancealso once the target is met.outcomeisMetorMissedfor a finished period andNot startedbefore it starts. An open period isOn track(chance to meet 80% or more),Likely to miss(20% or less) orAt risk(between); without a chance it isOn trackorAt riskfromprojectedEnd, or from pace when there is no forecast.statuscompares spend with pace only and is kept for compatibility.savings: what the EDP and private pricing discounts saved, read from the contract’sEdpDiscountandPrivateRateDiscountbilling rows.eligibleSpendis the contract’s spend AWS bills itself, before the discount (the EDP does not apply to AWS Marketplace, Azure or SaaS spend).realizedEdpRateis EDP savings as a percentage of it,nullwhen billing shows no EDP discount.projectedEdpSavingsextends each period’s rate over its forecast. Totals andperiods(keyed likeperiodsabove).nullfor usage-based contracts or when the savings could not be read.scopeRestricted:truewhen the caller’s data scope covers only part of the contract’s spend. The totals are then partial, andstatusandoutcomeshould not be read as on track or behind.projectedBreachDateis kept for compatibility; preferperiods[].projectedMeetMonth.
GET
https://api.nops.io
/
v1
/
contract-tracker
/
{id}
/
burndown
Get contract burndown
curl --request GET \
--url https://api.nops.io/v1/contract-tracker/{id}/burndown \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.nops.io/v1/contract-tracker/{id}/burndown"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.nops.io/v1/contract-tracker/{id}/burndown', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.nops.io/v1/contract-tracker/{id}/burndown"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"data": {
"data": {
"Amazon EC2": {
"granular": {
"2025-12-01": 41250.12,
"2026-01-01": 43980.55,
"2026-02-01": 44100
},
"total": 129330.67,
"isMarketplace": false,
"forecastBounds": {
"2026-02-01": {
"lo80": 40100,
"hi80": 48200,
"lo95": 38000,
"hi95": 50300
}
}
},
"Datadog (AWS Marketplace)": {
"granular": {
"2025-12-01": 1500,
"2026-01-01": 1500,
"2026-02-01": 1500
},
"total": 4500,
"isMarketplace": true
}
},
"forecastMonths": [
"2026-02-01"
],
"forecastModel": "RWD",
"projectedBreachDate": null,
"currentMonthActuals": {
"2026-02-01": 18240.3
},
"periods": [
{
"key": "2025",
"label": "Year 1",
"dateRange": "Dec 2025 - Nov 2026",
"actualSpend": 106971.97,
"projectedSpend": 490028.03,
"projectedEnd": 597000,
"projectedShortfall": 403000,
"projectedMeetMonth": null,
"projectedRange": {
"low": 512400,
"high": 681600
},
"meetChance": 0,
"target": 1000000,
"paceTarget": 249315.07,
"variance": -142343.1,
"status": "Behind",
"outcome": "Likely to miss",
"isComplete": false,
"isUsageBased": false
}
],
"savings": {
"edpSavings": 10346.45,
"privateRateSavings": 0,
"eligibleSpend": 129330.67,
"realizedEdpRate": 8,
"projectedEdpSavings": 46680,
"periods": [
{
"key": "2025",
"label": "Year 1",
"edpSavings": 10346.45,
"privateRateSavings": 0,
"eligibleSpend": 129330.67,
"realizedEdpRate": 8,
"projectedEdpSavings": 46680
}
]
},
"scopeRestricted": false
}
}{
"error": {
"code": "forbidden_scope",
"message": "API key is missing required scope: budgets:write",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "forbidden_scope",
"message": "API key is missing required scope: budgets:write",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Was this page helpful?