# Commitments

> Record a committed-spend agreement with a provider, track how much of it is used from reported cost, and see a forecast of where it will end.

Source: https://infro.io/docs/cost/commitments

> **Note:** INFRO is in private early access. Running these examples requires an early-access account, an active trial or subscription entitlement, and your own provider connection. Self-serve purchasing is not generally open. See [Early access](https://infro.io/early-access).

Many provider contracts include a spend commitment: an amount you agree to spend with the provider over a period, often in exchange for a discount. Missing it can mean paying for capacity you did not use; overshooting it early can mean paying list rates for the rest of the term. A commitment in INFRO tracks one such agreement against the cost your provider reports, and forecasts where it will end.

> **Note:** Available on the **Business** plan. The commitment is your contract with your provider — INFRO is not a party to it and bills none of it.

## Recording a commitment

Commitments are entered by hand, in the console. INFRO does not read contract terms from your provider.

- `provider_kind` (string, required) — The provider the commitment is with, such as `openai` or `anthropic`.
- `label` (string, required) — A name you will recognise, such as "OpenAI 2026 commit".
- `amount_usd` (number, required) — The committed amount in US dollars.
- `period_start` (YYYY-MM-DD, required) — First day of the term, UTC.
- `period_end` (YYYY-MM-DD, required) — Last day of the term, UTC, inclusive.
- `discount_pct` (number) — The discount the contract carries, for reference. It does not change any estimate; enter the rate itself under Prices.
- `models` (string[]) — Limit the commitment to these model ids. Omit it to count every model on that provider.
- `notes` (string) — Free text, such as a contract reference.

Creating, editing and deleting a commitment needs the `policy.manage` permission, and each change is recorded in the [audit log](https://infro.io/docs/org/audit-log). Every edit increments the commitment's version.

## Burn-down

- **Consumption is measured on reported cost** when the organization has a billing credential for that provider, which is what the provider will hold you to. See [Cost reconciliation](https://infro.io/docs/cost/reconciliation).
- **Without one, it falls back to INFRO's estimate**, and the commitment carries a warning saying so. An estimate uses list rates unless you entered your own, and can be missing unpriced traffic and traffic that does not go through INFRO, so it is a planning figure, not the number your provider will count.
- INFRO's estimate is shown beside the reported figure in either case, with a daily cumulative series for the whole term.
- Each commitment has a status: on track, under, over, not started, ended, or insufficient data.

## Forecast

The forecast is the amount consumed so far plus the **trailing 28-day daily mean, multiplied by the days remaining** in the term. The band around it comes from how much daily spend varied over those same 28 days. A new commitment reports insufficient data until there is enough history to compute it.

This is a straight-line projection of recent spend. It does not model seasonality, planned launches or price changes, and it says so rather than presenting the band as certainty.

## Warnings

- **Ending soon** — at 60, 30 and 7 days before the end of the term.
- **Forecast under** or **forecast over** — when the forecast differs from the committed amount by more than 10%.
- Warnings appear on the commitment in the console and in the API. Email delivery of warnings is not yet available.

## Suggestions never move traffic

When a commitment is forecast to fall short, INFRO may suggest a change, such as pointing a [route](https://infro.io/docs/routes) at the committed provider, with a link to where you would make it. It never reroutes traffic on its own. Routing decides where production requests go, and a change to it should be made by somebody who knows the application.

## API

`GET /v1/commitments` returns `{ "data": [...] }` with each commitment's terms, progress, forecast and warnings. It is read-only and needs the same key access as the [FOCUS export](https://infro.io/docs/observability/focus-export). Money is a US-dollar number; days are `YYYY-MM-DD` in UTC; `null` means unknown, never zero.

```json
{
  "id": "cmit_…",
  "provider_kind": "openai",
  "label": "OpenAI 2026 commit",
  "amount_usd": 120000,
  "period_start": "2026-01-01",
  "period_end": "2026-12-31",
  "basis": "reported",
  "basis_warning": null,
  "progress": {
    "as_of": "2026-09-23",
    "status": "on_track",
    "days_remaining": 99,
    "consumed_usd": 81230.4,
    "consumed_share": 0.677,
    "expected_share": 0.729,
    "forecast_usd": 112400.0,
    "forecast_low_usd": 108000.0,
    "forecast_high_usd": 116800.0,
    "forecast_vs_commit": -0.063
  },
  "warnings": []
}
```
