---
title: "GET /portfolio"
method: GET
path: "/portfolio"
tags: ["portfolio"]
---

# GET /portfolio

`GET /portfolio`

## Request

- Base URL: `https://api.focusbear.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.focusbear.io/portfolio`
- Auth: HTTP bearer

## Response `200`

- PortfolioResponseDto
  - `projects` PortfolioProjectResponseDto[], required
    - `id` string, required
    - `name` string, required
    - `due_date` string, nullable, required: ISO timestamp of the deadline the risk is judged against, or null when undated. For a date-only due date this is the end of that day in the user's zone, which can differ from the stored instant (GET /projects) when the row was saved in a stale device offset.
    - `importance` number, required
    - `outcome` number, nullable, required: Outcome significance on the 1..10 wire scale; null until explicitly rated.
    - `required_hours` number, required
    - `risk_score` number, required
    - `bucket` 'critical' | 'at_risk' | 'on_track' | 'no_deadline', required
    - `deficit_hours` number, required: Hours that won't fit before the due date. When the due date is inside the planning horizon this is the simulated per-day deficit (hours landing after the deadline plus hours that never fit); beyond the horizon it is the aggregate shortfall of all work due by then, which can include other projects'.
    - `days_until_due` number, nullable, required
    - `latest_start` string, nullable, required
    - `badges` string[], required
    - `top_priority_task` TopPriorityTaskDto, required
      - `id` string, required
      - `title` string, required
      - `top_score` number, nullable, required: Materialised TOP score. Null for todos not yet scored by the daily cron.
    - `scheduled_hours` number, required
    - `unscheduled_hours` number, required
    - `projected_completion_date` string, nullable, required: Local 'YYYY-MM-DD' the project is likely done, or null when it spills past the horizon. Always after the due date when `plan_feasible` is false: an overrun later on the due day itself reports the day after, even when that is the day after the last simulated day or differs from `pushed_tasks[].projected_date`. A project due beyond the horizon can show a positive aggregate `deficit_hours` without moving this date.
    - `plan_feasible` boolean, required
    - `pushed_task_ids` string[], required
  - `due_this_week` string[], required
  - `start_now` string[], required
  - `overcommitted` boolean, required
  - `total_required_hours` number, required
  - `total_available_hours` number, required
  - `plan_feasible` boolean, required
  - `pushed_tasks` PortfolioPushedTaskDto[], required
    - `id` string, required
    - `project_id` string, nullable, required
    - `planned_date` string, required
    - `projected_date` string, nullable, required: Local 'YYYY-MM-DD' the task is projected to finish, or null when it spills past the horizon.

---

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