---
title: "Generate a Portfolio Health deck (cross-portfolio executive view)"
method: POST
path: "/v1/workflows/agile/portfolio-health"
tags: ["workflows"]
---

# Generate a Portfolio Health deck (cross-portfolio executive view)

`POST /v1/workflows/agile/portfolio-health`

## Request

- Base URL: `https://api.slideforge.dev`
- URL: `https://api.slideforge.dev/v1/workflows/agile/portfolio-health`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Cross-portfolio executive view. 4 slides:
1. Executive Dashboard (workspace KPIs)
2. Project RAG Grid (per-project independent health status)
3. Portfolio Epic Burnup (all epics across all projects)
4. Highlights & Risks

**Audience:** portfolio mgmt, executives, steering committees.
**Cadence:** monthly or quarterly.
**Scope:** workspace-only (single-project portfolio view doesn't apply — project_id is silently ignored if provided).

**Deferred** until source data exists: Portfolio Kanban with WIP limits, Capacity Allocation by value stream.

## Request body

- AgileWorkflowRequest: Shared request body for /v1/workflows/agile/* endpoints. Three input modes (mutually exclusive): Mode A (stored OAuth): connection_id [+ project_id for single-project, omit for workspace-wide] Mode B-staging: staging_data dict — NOT YET IMPLEMENTED in Phase A Mode B-prepared: prepared_data dict (a SprintMetrics-shaped dict) → render only
  - `connection_id` string, nullable: OAuth connection (from /v1/oauth/{vendor}/authorize flow). Workspace-wide aggregation when project_id is omitted.
  - `project_id` string, nullable: Project ID (single-project mode); omit for workspace-wide aggregation.
  - `sprint_history` integer: Number of past sprints for trending
  - `staging_data` object, nullable: Caller-supplied canonical entities (SprintData, etc). NOT YET implemented.
  - `prepared_data` object, nullable: Pre-computed SprintMetrics-shaped dict — render only. Keys match SprintMetrics dataclass fields.
  - `theme_id` string
  - `options` object: Workflow-specific options, e.g. {exclude_slides: [...]}

## Response `202`

Report queued

- unknown

## Other responses

- `400`: Invalid input
- `401`: Authentication required
- `422`: Validation Error

---

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