---
title: "The people-table rows for the people_table surface"
method: GET
path: "/v1/skill-installations/{installation_id}/people"
tags: ["skill-hub"]
---

# The people-table rows for the people_table surface

`GET /v1/skill-installations/{installation_id}/people`

## Request

- Base URL: `https://api.patricia.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.patricia.app/v1/skill-installations/{installation_id}/people`
- Auth: HTTP bearer

The Hub's people table: every subject Patricia looks after (the tenant member roster for a person-fact skill, unioned with any subject that already has a resolved fact), pivoted so each bound fact is a column (a 'Sep 6' month/day label when present, empty when awaiting/opted-out) plus a rollup status pill and the next delivery date. COMPLETE (not paginated), bounded by the tenant's headcount, so a member awaiting a date is always present to fill. Generic: the columns come from the installation's compiled fact bindings (person facts for Celebrations, client facts for renewal-reminder). PII-safe: display handles + month/day + status only, never a birth year.

## Path parameters

- `installation_id` string, uuid, required

## Headers

- `X-Tenant-Id` string, nullable

## Response `200`

Successful Response

- PeopleTableResponse: The resolved people-table read-model (fact columns + subject rows) for one installation. ``fact_columns`` are the header cells (``domain_key`` + ``label``) in a deterministic order; each row's ``facts`` list is aligned to the same order so the dashboard renders a stable column layout for any skill's bound facts.
  - `installation_id` string, uuid, required
  - `fact_columns` FactCellSummary[], required
    - `domain_key` string, required
    - `label` string, required
    - `status_code` string, required
    - `display` string, nullable, required
    - `value_type_code` 'date' | 'recurring_date' | 'text' | 'number' | 'bool' | 'enum' | 'json', required: The typed value shape of a canonical fact (``attribute_definition.value_type_code``). Denormalized onto ``attribute_source_value``/``attribute_current`` (via a composite FK to the definition) so a CHECK can enforce that exactly the matching typed column is populated. A *new* value type is a platform migration, never runtime data.
  - `rows` PeopleRowSummary[], required
    - `subject_key` string, required
    - `entity_id` string, uuid, nullable, required
    - `display_label` string, required
    - `status_code` string, required
    - `facts` FactCellSummary[], required
      - `domain_key` string, required
      - `label` string, required
      - `status_code` string, required
      - `display` string, nullable, required
      - `value_type_code` 'date' | 'recurring_date' | 'text' | 'number' | 'bool' | 'enum' | 'json', required: The typed value shape of a canonical fact (``attribute_definition.value_type_code``). Denormalized onto ``attribute_source_value``/``attribute_current`` (via a composite FK to the definition) so a CHECK can enforce that exactly the matching typed column is populated. A *new* value type is a platform migration, never runtime data.
    - `next_delivery_date` string, date, nullable, required

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)
- `404`: Not found
- `422`: Validation error

---

[API](https://skmtc.dev/patricia/apis/patricia-api.md) · [All operations](https://skmtc.dev/patricia/apis/patricia-api/llms.txt) · [OpenAPI document](https://skmtc.dev/patricia/apis/patricia-api/revisions/0dfb44495ea1?raw)
