---
title: "The compiled feature bundle that renders this installation"
method: GET
path: "/v1/skill-installations/{installation_id}/surfaces"
tags: ["skill-hub"]
---

# The compiled feature bundle that renders this installation

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

## 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}/surfaces`
- Auth: HTTP bearer

The compiled feature-contract rows the dashboard renders generically: surfaces (keyed by surface_kind_code), their read-model descriptors, the bound actions, and the delivery policy. Proves 'no per-skill UI': the same bundle shape renders every skill.

## Path parameters

- `installation_id` string, uuid, required

## Headers

- `X-Tenant-Id` string, nullable

## Response `200`

Successful Response

- SkillSurfaceBundle: Everything the Hub needs to render one installation's feature: surfaces + read-models + delivery. The dashboard renders each ``surface`` by its ``surface_kind_code`` and binds it to the read-model in ``read_models`` whose id matches ``surface.feature_read_model_id``. Proves "no per-skill UI": the same bundle shape renders Celebrations and the generality fixtures alike.
  - `installation_id` string, uuid, required
  - `manifest_version_id` string, uuid, required
  - `surfaces` FeatureSurfaceSummary[], required
    - `id` string, uuid, required
    - `surface_kind_code` string, required
    - `placement` string, nullable, required
    - `feature_read_model_id` string, uuid, nullable, required
    - `sort_order` integer, required
  - `read_models` FeatureReadModelSummary[], required
    - `id` string, uuid, required
    - `name` string, required
    - `repository_binding` string, required
    - `columns` unknown[], required
      - unknown
    - `filters` object, required
    - `sort` unknown[], required
      - unknown
    - `pagination_envelope` object, required
  - `actions` FeatureActionSummary[], required
    - `id` string, uuid, required
    - `surface_id` string, uuid, nullable, required
    - `action_kind_code` string, required
    - `endpoint` string, required
    - `rbac_permission` string, required
    - `state_transition` string, nullable, required
  - `delivery_policy` DeliveryPolicySummary, required: The compiled delivery contract for the installed version (mode / template / reversal / caps).
    - `mode_code` string, required
    - `target_resolver` string, nullable, required
    - `template_id` string, nullable, required
    - `reversal_policy_code` string, nullable, required
    - `send_cap_per_window` integer, 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)
