Skip to content

Budget versus actual

Reports module

GET/reports/budget-vs-actualreports.budgetVsActual

Revised budget (working budget plus approved change orders) against actual spend, grouped by one dimension. Unpriced lines stay out of each sum and are counted in `unpriced_count`. A rule that refuses the request returns 422 with `refusal` and `reason`.

  • Requires the capability finance.budget.read.
  • OAuth scopes: finance.
  • Error statuses: 400, 401, 422, 429. Errors are RFC 9457 problem details.

Path and query parameters

reports.budgetVsActual: Path and query parameters
FieldTypeRequiredDescription
project_idstring (uuid)NoOnly this project; every visible project when omitted.
dimension"account" | "costCenter" | "department" | "urid" | "project"NoGrouping dimension; defaults to account.

Response 200: ReportRowPage

reports.budgetVsActual: ReportRowPage
FieldTypeRequiredDescription
dataarray of ReportRowYesItems on this page, in the documented default order.
next_cursorstring | nullYesOpaque cursor for the next page; null on the last page.
{
  "data": [
    {
      "dimension": "5400",
      "budget": {
        "total_minor": 1250000,
        "currency": "USD",
        "unpriced_count": 2
      },
      "actual": {
        "total_minor": 1250000,
        "currency": "USD",
        "unpriced_count": 2
      }
    }
  ],
  "next_cursor": null
}

Code samples

curl -X GET "$XOS_BASE_URL/reports/budget-vs-actual" \
  -H "Authorization: Bearer $XOS_API_KEY"
const { data } = await xos.reports.budgetVsActual();
response = xos.reports.budget_vs_actual()
xos reports budget-vs-actual