# Get provider potential savings breakdown

> Returns paginated potential savings breakdown for a specific provider

Source: https://docs.levelfour.ai/api-reference/providers/get-providers-by-id-potential-savings-breakdown


## GET /api/v1/providers/{provider_id}/potential-savings/breakdown

Returns paginated potential savings breakdown for a specific provider

### Authentication

Send `Authorization: Bearer <token>`.

### Parameters

- `provider_id` (path, string, required)
- `page` (query, integer, default `1`): Page number (1-indexed)
- `page_size` (query, integer, default `20`): Items per page (max 200)
- `sort_by` (query, string, default `status`): Field to sort by
- `sort_order` (query, one of `asc`, `desc`, default `asc`): Sort order

### Responses

#### 200: Successful Response

- `success` (boolean, default `true`)
- `timestamp` (date-time string)
- `data` (object, required): Provider-specific breakdown with pagination
  - `total_savings` (number, required): Sum of monthly_savings for all recommendations (not just current page)
  - `total_savings_count` (integer, default `0`): Count of individual savings the total_savings sum covers (every row matching the filters, children and group members included). pagination.total_items counts only chain anchors, so total_savings_count is greater whenever dependencies or groups collapse rows in the table.
  - `items` (array of object, required)
    - `recommendation_id` (string, required): Unique identifier for the recommendation
    - `service` (string, required): Service name (e.g., EC2, EBS, RDS)
    - `resource_type` (string, nullable): What the recommendation was raised as. commitment_renewal and commitment_purchase buy a commitment, which only an organization admin releases, in the dashboard or through an MCP connection they authorized
    - `environment` (string, nullable): Environment (e.g., Production, Staging)
    - `account` (string, nullable): Cloud account identifier
    - `tag` (string, nullable): Resource tag value
    - `monthly_savings` (number, required): Monthly savings amount
    - `savings_percentage` (number, required): Savings as percentage of current spending
    - `status` (one of `pending`, `processing`, `in_progress`, `optimized`, `rejected`, `unavailable`, `failed`, default `pending`): Recommendation status
    - `display_status` (one of `available`, `awaiting_approval`, `pending`, `saved`, `rejected`, `unavailable`, default `available`): Status the person reads, served once so the dashboard, the CLI and MCP all print the same word. Derived from status, saving_acceptance and execution_request_status; a request waiting on an approver outranks everything else. Prefer this over status for display
    - `actions` (object, nullable): Action details for this recommendation
      - `description` (string, nullable): Brief summary of the recommendation
      - `overview` (string, nullable): Detailed overview explaining the recommendation (supports markdown)
      - `implementation_process` (string, nullable): How to implement this recommendation (supports markdown)
      - `execution_method` (string, nullable): Technical execution details (supports markdown)
      - `key_takeaway` (string, nullable): Important notes, risks, and safety information (supports markdown)
      - `operational_impact` (string, nullable): Impact on operations and any downtime requirements (supports markdown)
    - `terms_accepted_at` (string, nullable): When terms were accepted, null if not yet accepted
    - `saving_accepted_by` (string, nullable): User who authored/approved the savings decision
    - `saving_acceptance` (string, nullable): accepted or rejected once the tenant decides, null while still untouched
    - `implementation_method` (string, nullable): Chosen implementation method: one-click, iac, one-click-plus-iac, or manual
    - `implementation_status` (one of `in_progress`, `completed`, `failed`, `warning`, nullable): Rollout status: in_progress, completed, failed, or warning, null when no rollout is underway
    - `implementation_tags` (array of string): Implementation formats this savings can be delivered with (capabilities): Automated Savings, Automated Savings + IaC, IaC, or Manual Setup. A savings may carry more than one. Distinct from implementation_method, the single chosen path.
    - `created_at` (string, nullable): When the recommendation was created (ISO 8601)
    - `updated_at` (string, nullable): When the recommendation was last modified (ISO 8601), null if never modified
    - `group_id` (string, nullable): Id of the group this savings belongs to, null when ungrouped
    - `group_name` (string, nullable): Display name of the group this savings belongs to
    - `linked_to` (object, nullable)
    - `execution_request_status` (string, nullable): Dual-control execution state: pending_approval, approved, or rejected (null when never requested)
    - `execution_request_by` (string, nullable): Email of the member who requested execution, null when never requested
    - `execution_request_by_name` (string, nullable): Display name of the member who requested execution, null when unknown or never requested
    - `execution_request_at` (string, nullable): When execution was requested (ISO 8601), null when never requested
    - `virtual_tags` (map of string to string): Virtual tag values of this savings' resources, key name to value name. Where its resources carry several values of one key, the one holding the most spend
    - `risk_assessment` (object, nullable): Risk level denormalized from actions so the table Risk column renders. Carries the level only (LOW, MODERATE, HIGH, or CRITICAL); factors and sources stay on the detail endpoint. Null when the recommendation has no assessment
  - `pagination` (object, required): Pagination metadata
    - `total_items` (integer, required): Total number of items across all pages
    - `total_pages` (integer, required): Total number of pages
    - `current_page` (integer, required): Current page number (1-indexed)
    - `page_size` (integer, required): Number of items per page
    - `has_next` (boolean, required): Whether there is a next page
    - `has_previous` (boolean, required): Whether there is a previous page

#### Errors

- `400`: Bad Request
- `401`: Authentication Error
- `403`: Authorization Error
- `404`: Not Found
- `409`: Conflict
- `422`: Validation Error
- `429`: Rate Limit Exceeded
- `500`: Internal Server Error

Body of `400`, `401`, `403`, `404`, `409`, `422`, `429`, `500`:

- `success` (`false`, required)
- `error` (object, required)
  - `code` (string, required)
  - `message` (string, required)
  - `details` (any)
- `timestamp` (date-time string, required)
