---
title: "Budget-vs-actual variance per completed calendar month (#1159)"
method: GET
path: "/companies/{companyId}/forecast/variance"
tags: ["Forecast"]
---

# Budget-vs-actual variance per completed calendar month (#1159)

`GET /companies/{companyId}/forecast/variance`

## Request

- Base URL: `https://api.medianfi.com/api/v1`
- URL: `https://api.medianfi.com/api/v1/companies/{companyId}/forecast/variance`
- Auth: HTTP bearer

## Query parameters

- `scenario` union
  - 'budget'
  - string, uuid

## Response `200`

Per-month variance with favorability + material flags

- object
  - `success` boolean
  - `data` ForecastVarianceResponse
    - `scenarioId` string, uuid, nullable, required: The locked budget scenario used as plan, if any
    - `materialityFloorCents` integer, required: Absolute materiality floor in the supplied currency's minor units
    - `materialityPct` number, required: Relative materiality threshold (default 0.1)
    - `currency` string, required
    - `minorUnitExponent` 2, required
    - `moneyAuthorityVersion` 1, required
    - `months` VariancePoint[], required
      - `offset` integer, required
      - `label` string, required
      - `period` string, required: YYYY-MM
      - `revenue` VarianceCell, required
        - `actualCents` integer, required
        - `planCents` integer, nullable, required: From the locked budget scenario; null when no budget is locked
        - `varianceCents` integer, required: actual - plan (0 when plan is null)
        - `favorable` boolean, required: Sign-aware (revenue/net over plan favorable; expense under plan favorable)
        - `material` boolean, required: |variance| over the authoritative minor-unit floor OR |variance/plan| over the pct threshold
      - `expense` VarianceCell, required
        - `actualCents` integer, required
        - `planCents` integer, nullable, required: From the locked budget scenario; null when no budget is locked
        - `varianceCents` integer, required: actual - plan (0 when plan is null)
        - `favorable` boolean, required: Sign-aware (revenue/net over plan favorable; expense under plan favorable)
        - `material` boolean, required: |variance| over the authoritative minor-unit floor OR |variance/plan| over the pct threshold
      - `net` VarianceCell, required
        - `actualCents` integer, required
        - `planCents` integer, nullable, required: From the locked budget scenario; null when no budget is locked
        - `varianceCents` integer, required: actual - plan (0 when plan is null)
        - `favorable` boolean, required: Sign-aware (revenue/net over plan favorable; expense under plan favorable)
        - `material` boolean, required: |variance| over the authoritative minor-unit floor OR |variance/plan| over the pct threshold

## Other responses

- `401`: Authentication required
- `403`: Insufficient permissions or not a company member
- `404`: Resource not found
- `422`: Validation error

---

[API](https://skmtc.dev/medianfi/apis/median-api.md) · [All operations](https://skmtc.dev/medianfi/apis/median-api/llms.txt) · [OpenAPI document](https://skmtc.dev/medianfi/apis/median-api/revisions/20090ea32b0d?raw)
