# people_costs

Read each person's employment cost over the selected work-month window, with components and explicit missing attribution or work periods.

## What it shows

Actual People cost totals over the selected evidenced work-month window, by person, currency and component, with booked functional amounts. Unattributed and unknown-work-period costs stay explicit. Uses financial report permission separately from the People roster; 36-month maximum and bounded person pages.

## Example MCP App view

The read-only example below uses illustrative demo data and the same report component as the MCP App. These are not your books or the result of the request example.

<iframe class="docs-report-preview" src="/docs/report-previews/people_costs.html" title="people_costs report view with demo data" loading="lazy" sandbox referrerpolicy="no-referrer"></iframe>

[Open the full example view](/docs/report-previews/people_costs.html).

## Inputs

Send the fixed `kind` and these parameters at the top level of the report request, not inside `input`.

Required means required within its containing object; an optional parent can be omitted.

| Field | Type | Required | Meaning and accepted values |
|---|---|---|---|
| `from_month` | string | Yes | First month, YYYY-MM. Format: month. Example: `"2026-10"`. |
| `through_month` | string | No | Last month, YYYY-MM (default: this month). Format: month. Example: `"2026-10"`. |
| `person_party_id` | string | No | Stable person party to filter.  |
| `provider_party_id` | string | No | Payroll provider party to filter.  |
| `limit` | integer | No | Maximum rows per page, up to 100 (default 100). Minimum: `1`. Maximum: `100`. |
| `after` | string | No | Opaque nextCursor from the preceding report page with the same filters.  |

## Reading the result

Running this report does not change the books. Its description above distinguishes recorded-book summaries from previews based on supplied facts or assumptions. Interpret its totals, grouping, missing-data indicators and pagination using that description. Monetary amounts are integer strings in the reported unit; ratios and assumptions can be fractional numbers. An empty result is not evidence that the business had no activity.

The public OpenAPI contract does not enumerate this report's result fields. Fetch `GET /v1/reports` for its live description and parameters, and inspect the returned JSON rather than assuming an output shape.

## Example request


```json
{
  "kind": "people_costs",
  "from_month": "2026-10",
  "through_month": "2026-10"
}
```


[All reports](/docs/report-reference/) · [Operation and errors](/docs/api-reference/operations/reports-run/) · [Reusable schemas](/docs/api-reference/components/)

Keep credentials out of prompts; rehearse writes only in a disposable sandbox.

## Exact request schema


```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "kind": {
      "const": "people_costs"
    },
    "from_month": {
      "description": "First month, YYYY-MM.",
      "type": "string",
      "minLength": 1,
      "pattern": "^[0-9]{4}-[0-9]{2}$"
    },
    "through_month": {
      "description": "Last month, YYYY-MM (default: this month).",
      "type": "string",
      "minLength": 1,
      "pattern": "^[0-9]{4}-[0-9]{2}$"
    },
    "person_party_id": {
      "description": "Stable person party to filter.",
      "type": "string",
      "minLength": 1
    },
    "provider_party_id": {
      "description": "Payroll provider party to filter.",
      "type": "string",
      "minLength": 1
    },
    "limit": {
      "description": "Maximum rows per page, up to 100 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "after": {
      "description": "Opaque nextCursor from the preceding report page with the same filters.",
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "kind",
    "from_month"
  ]
}
```


