# Hours saved How the hours-saved figure is calculated, and the overrides an admin can set. 2 routes, from the API’s own OpenAPI document. URL: https://docs.qaldy.com/reference/api/roi/ 2 routes. Every path starts at `https://cloud-api.qaldy.com`. Sign-in, tokens, errors and limits are on the [overview](https://docs.qaldy.com/reference/api/). ## Routes | Method | Path | What it does | |---|---|---| | [[GET]] | [`/​v1/​workspaces/​{ws}/​roi`](#get-v1-workspaces-ws-roi) | Hours saved this year, with the formula rows | | [[PUT]] | [`/​v1/​workspaces/​{ws}/​roi/​overrides`](#put-v1-workspaces-ws-roi-overrides) | Edit an app's manual minutes per run (admins) | ## Reference ### [[GET]] `/v1/workspaces/{ws}/roi` Hours saved this year, with the formula rows. - **Authentication:** the console’s session cookie. - **Token:** a personal access token or an MCP sign-in with the `read` scope. - **Who:** member | Parameter | In | Type | Required | Notes | |---|---|---|---|---| | `ws` | path | string | yes | 1 to 128 characters | **Response 200** | Field | Type | Required | Notes | |---|---|---|---| | `period` | "year" | yes | | | `hoursSaved` | number | yes | at least 0 | | `runs` | integer | yes | at least 0 | | `moneySavedMinor` | integer | yes | at least 0 | | `hourlyCostMinor` | integer | yes | at least 0 | | `currency` | "EUR" · "USD" · "KZT" | yes | | | `trees` | integer | yes | at least 0 | | `rows` | object[] | yes | | | `rows[].appId` | string | yes | at least 1 characters | | `rows[].appName` | string | yes | at least 1 characters | | `rows[].runs` | integer | yes | at least 0 | | `rows[].manualMinutesPerRun` | number | yes | at least 0 | | `rows[].minutes` | number | yes | at least 0 | | `rows[].hours` | number | yes | at least 0 | | `rows[].overridden` | boolean | yes | | | `rows[].demoBaselineRuns` | integer | | at least 0. default 0 | Errors: `400`, `401`, `403`, `404`, `409`, `429` (the error format is on the [overview](https://docs.qaldy.com/reference/api/#errors)). ### [[PUT]] `/v1/workspaces/{ws}/roi/overrides` Edit an app's manual minutes per run (admins). - **Authentication:** the console’s session cookie. - **Token:** not available. This route is for a signed-in person in the console (`403 console_only` for a token). - **Who:** admin | Parameter | In | Type | Required | Notes | |---|---|---|---|---| | `ws` | path | string | yes | 1 to 128 characters | **Request body** (`application/json`) | Field | Type | Required | Notes | |---|---|---|---| | `appId` | string | yes | at least 1 characters | | `manualMinutesPerRun` | number | yes | 0 to 1440 | **Response 200** | Field | Type | Required | Notes | |---|---|---|---| | `period` | "year" | yes | | | `hoursSaved` | number | yes | at least 0 | | `runs` | integer | yes | at least 0 | | `moneySavedMinor` | integer | yes | at least 0 | | `hourlyCostMinor` | integer | yes | at least 0 | | `currency` | "EUR" · "USD" · "KZT" | yes | | | `trees` | integer | yes | at least 0 | | `rows` | object[] | yes | | | `rows[].appId` | string | yes | at least 1 characters | | `rows[].appName` | string | yes | at least 1 characters | | `rows[].runs` | integer | yes | at least 0 | | `rows[].manualMinutesPerRun` | number | yes | at least 0 | | `rows[].minutes` | number | yes | at least 0 | | `rows[].hours` | number | yes | at least 0 | | `rows[].overridden` | boolean | yes | | | `rows[].demoBaselineRuns` | integer | | at least 0. default 0 | Errors: `400`, `401`, `403`, `404`, `409`, `429` (the error format is on the [overview](https://docs.qaldy.com/reference/api/#errors)).