# Get provider-specific recommendations breakdown

> Returns paginated breakdown of recommendations for a specific provider

Source: https://docs.levelfour.ai/api-reference/providers/get-providers-by-id-recommendations


## GET /api/v1/providers/{provider_id}/recommendations

Returns paginated breakdown of recommendations for a specific provider

### Authentication

Send `Authorization: Bearer <token>`.

### Parameters

- `provider_id` (path, string, required)
- `start` (query, string, nullable): Start date filter (ISO 8601 format: YYYY-MM-DD)
- `end` (query, string, nullable): End date filter (ISO 8601 format: YYYY-MM-DD)
- `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 (recommendation_id, service, environment, account, tag, monthly_savings, savings_percentage, status, saving_acceptance, implementation_method, implementation_status, created_at, updated_at, risk_assessment). risk_assessment ranks by severity (LOW, MODERATE, HIGH, CRITICAL); recommendations with no assessment sort last in both directions
- `sort_order` (query, one of `asc`, `desc`, default `asc`): Sort order
- `service` (query, array of string, nullable): Filter by service(s) - can be repeated for multiple values
- `environment` (query, array of string, nullable): Filter by environment(s) - can be repeated for multiple values
- `account` (query, array of string, nullable): Filter by account(s) - can be repeated for multiple values
- `tag` (query, array of string, nullable): Filter by tag(s) - can be repeated for multiple values
- `service_not` (query, array of string, nullable): Exclude service(s) - can be repeated for multiple values
- `environment_not` (query, array of string, nullable): Exclude environment(s) - can be repeated for multiple values
- `account_not` (query, array of string, nullable): Exclude account(s) - can be repeated for multiple values
- `tag_not` (query, array of string, nullable): Exclude tag(s) - can be repeated for multiple values
- `resource_type` (query, array of string, nullable): Filter by resource type(s), such as commitment_purchase or commitment_renewal - can be repeated for multiple values
- `resource_type_not` (query, array of string, nullable): Exclude resource type(s) - can be repeated for multiple values
- `display_status` (query, array of string, nullable): Filter by display status(es): available, pending, awaiting_approval, processing, optimized (alias: saved), in_progress, failed, rejected, unavailable
- `search` (query, string, nullable): Search across recommendation fields (case-insensitive)
- `savings` (query, array of string, nullable): Keep only linked savings of these types: 'parent' (dependency parent) or 'group' (aggregator)
- `savings_not` (query, array of string, nullable): Exclude linked savings of these types: 'parent' or 'group'
- `available_formats` (query, array of string, nullable): Keep only savings whose available formats intersect these values: automated, iac, or manual. Can be repeated for multiple values (OR match).
- `available_formats_not` (query, array of string, nullable): Exclude savings whose available formats intersect these values: automated, iac, or manual. Can be repeated for multiple values.
- `virtual_tag_key` (query, string, nullable): Virtual tag key, by id or name (case-insensitive). Needs virtual_tag_value
- `virtual_tag_value` (query, array of string, nullable): Keep savings whose resources carry one of these values of virtual_tag_key. __unallocated__ matches resources no config assigned

### 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)
