> ## Documentation Index
> Fetch the complete documentation index at: https://docs.openops.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cloudability

> An overview of how Cloudability can be integrated with OpenOps

export const productName_0 = "Cloudability"

export const recommendationsActionName_0 = "Get Recommendations"

export const tagArrayName_0 = "tagMappings"

export const snoozeActionName_0 = "Snooze Recommendations"

export const NarrowImage = ({src, alt, widthPercent}) => {
  const className = `narrow-image-${useId().replace(/:/g, '-')}`;
  const widthRule = widthPercent ? `width: ${widthPercent}%;` : '';
  return <>
      <style>{`
        .${className} {
          max-width: 75%;
          ${widthRule}
        }
        @media (max-width: 768px) {
          .${className} {
            max-width: 100%;
            width: auto;
          }
        }
      `}</style>

      <img className={className} src={src} alt={alt} />
    </>;
};

OpenOps integrates with [Cloudability](https://www.apptio.com/products/cloudability/) to automate the retrieval and management of cloud resource usage recommendations.

## Actions

OpenOps provides four [actions](/workflow-management/actions) for interacting with Cloudability:

<NarrowImage src="/images/cloudability-actions.png" alt="Cloudability actions" />

All Cloudability actions are based on the [Cloudability API](https://www.ibm.com/docs/en/cloudability-commercial/cloudability-standard/saas?topic=api-getting-started-cloudability-v3) and require configuring a Cloudability [connection](/cloud-access/access-levels-permissions) with your API key and API URL.

<NarrowImage src="/images/cloudability-connection.png" alt="Configuring a Cloudability connection" />

The following sections describe the four actions available in the Cloudability block.

### Get Recommendations

Retrieves cost optimization recommendations from Cloudability with extensive filtering options:

* **Vendor Type**: AWS, Azure, GCP, or Containers
* **Recommendation Type**: Dynamic dropdown based on the selected vendor
* **Look-Back Period**: Last 10 or 30 days
* **Cost Basis**: On-Demand or Effective pricing
* **Recommendations Status**: Show only active, show all (including snoozed), or show only snoozed
* **Limit**: Optional maximum number of recommendations to return
* **Additional Filters**: Custom filters per [Cloudability's rightsizing API documentation](https://www.ibm.com/docs/en/cloudability-commercial/cloudability-standard/saas?topic=api-rightsizing-end-points)

Below is a sample output returned by this step when it is configured to request active AWS EC2 recommendations with a 10-day look-back period:

<Expandable title="Cloudability recommendations">
  ```json theme={null}
  {
    "meta": {
      "info": [],
      "aggregates": [
        {
          "cost": 6.1,
          "basis": "On-Demand",
          "idleSavings": 0,
          "optimizedSavings": 4.97,
          "rightsizeSavings": 1.13
        }
      ],
      "totalCount": 1
    },
    "result": [
      {
        "os": "Linux",
        "idle": 23,
        "name": "LDN-APP03",
        "cpuMax": 22,
        "gpuMax": "N/A",
        "region": "eu-west-2",
        "service": "ec2-recs",
        "snoozed": false,
        "tenancy": "default",
        "lastSeen": "2025-07-20T23:00:00Z",
        "nodeType": "t2.small",
        "provider": "NATIVE",
        "memoryMax": "N/A",
        "unitPrice": 0.03,
        "totalSpend": 6.1,
        "accountName": "Training Account - AL",
        "cpuCapacity": 0.2,
        "gpuCapacity": 0,
        "localDrives": -1,
        "tagMappings": [
          {
            "tag": "tag2",
            "tagName": "Department",
            "vendorTagValue": "shared services"
          },
          {
            "tag": "tag3",
            "tagName": "Business Unit",
            "vendorTagValue": "shared services"
          },
          {
            "tag": "tag5",
            "tagName": "Resource Name",
            "vendorTagValue": "ldn-app03"
          },
          {
            "tag": "tag12",
            "tagName": "Department Mispelling",
            "vendorTagValue": "shared services"
          },
          {
            "tag": "tag21",
            "tagName": "Scaleup",
            "vendorTagValue": "shared services"
          }
        ],
        "commentCount": 4,
        "currencyCode": "USD",
        "daysInactive": 0,
        "gpuMemoryMax": "N/A",
        "hoursRunning": 234.51,
        "localCapacity": -1,
        "instanceFamily": "t2",
        "memoryCapacity": 2,
        "networkCapacity": 100,
        "recommendations": [
          {
            "risk": 0,
            "action": "Rightsize",
            "cpuRisk": 0,
            "savings": 1.13,
            "cpuRatio": 2,
            "diskRisk": 0,
            "gpuRatio": 0,
            "nodeType": "t3a.small",
            "memoryFit": true,
            "unitPrice": 0.02,
            "currentGen": true,
            "inDefaults": true,
            "memoryRisk": 0,
            "sameFamily": false,
            "sameMemory": true,
            "savingsPct": 18,
            "cpuCapacity": 0.4,
            "gpuCapacity": 0,
            "localDrives": -1,
            "memoryRatio": 1,
            "networkRisk": 0,
            "maxInstances": 1,
            "minInstances": 1,
            "networkRatio": 50,
            "defaultsOrder": 1,
            "localCapacity": -1,
            "gpuMemoryRatio": 0,
            "instanceFamily": "t3a",
            "memoryCapacity": 2,
            "networkCapacity": 5000,
            "preferenceOrder": 1,
            "diskXPutCapacity": 160,
            "gpuMemoryCapacity": 0,
            "previousGenTarget": false,
            "persistentStorageAdded": false
          },
          {
            "risk": 0,
            "action": "Rightsize",
            "cpuRisk": 0,
            "savings": 0.56,
            "cpuRatio": 2,
            "diskRisk": 0,
            "gpuRatio": 0,
            "nodeType": "t3.small",
            "memoryFit": true,
            "unitPrice": 0.02,
            "currentGen": true,
            "inDefaults": true,
            "memoryRisk": 0,
            "sameFamily": false,
            "sameMemory": true,
            "savingsPct": 9,
            "cpuCapacity": 0.4,
            "gpuCapacity": 0,
            "localDrives": -1,
            "memoryRatio": 1,
            "networkRisk": 0,
            "maxInstances": 1,
            "minInstances": 1,
            "networkRatio": 50,
            "defaultsOrder": 2,
            "localCapacity": -1,
            "gpuMemoryRatio": 0,
            "instanceFamily": "t3",
            "memoryCapacity": 2,
            "networkCapacity": 5000,
            "preferenceOrder": 2,
            "diskXPutCapacity": 160,
            "gpuMemoryCapacity": 0,
            "previousGenTarget": false,
            "persistentStorageAdded": false
          }
        ],
        "snoozeExpiresOn": "",
        "vendorAccountId": "366445176032",
        "availabilityZone": "eu-west-2c",
        "defaultMemoryFit": true,
        "maxInstanceCount": 1,
        "minInstanceCount": 1,
        "defaultCurrentGen": true,
        "defaultSameFamily": false,
        "gpuMemoryCapacity": 0,
        "resourceIdentifier": "i-0d380eee1c3bc4fed",
        "defaultCrossArchitecture": false
      }
    ]
  }
  ```
</Expandable>

### Snooze Recommendations

Temporarily dismisses specific recommendations:

* **Vendor Type**: AWS, Azure, GCP, or Containers
* **Recommendation Type**: Dynamic dropdown based on the selected vendor
* **Account ID**: The cloud account ID
* **Resource IDs**: Array of resource IDs to snooze
* **Snooze Until**: Date in `yyyy-MM-dd` format, or "never" for indefinite snoozing

### Unsnooze Recommendations

Reactivates previously snoozed recommendations:

* **Vendor Type**: AWS, Azure, GCP, or Containers
* **Recommendation Type**: Dynamic dropdown based on the selected vendor
* **Account ID**: The cloud account ID
* **Resource IDs**: Array of resource IDs to unsnooze

### Custom API Call

Allows making arbitrary calls to any [Cloudability API](https://www.ibm.com/docs/en/cloudability-commercial/cloudability-standard/saas?topic=api-getting-started-cloudability-v3) endpoint:

* **URL**: Dynamic endpoint selection
* **Method**: `GET`, `POST`, `PATCH`, `PUT`, `DELETE`, or `HEAD`
* **Headers**: Optional (authorization auto-injected)
* **Query Parameters**: Optional
* **Body**: Optional JSON payload

## Designing a workflow

A typical {productName_0} workflow starts by collecting active recommendations using the *{recommendationsActionName_0}* action, then iterating through them, determining the owner of the affected resource, and deciding whether to request an action from the owner. If the owner approves the action, the workflow can remediate the resource using the actions available for the [cloud platforms OpenOps supports](/cloud-access/supported-cloud-providers).

Below is a description of common patterns that can be implemented in your {productName_0} workflows.

### Owner mapping

{productName_0} recommendations often need to be routed to the appropriate resource owners for review and action. OpenOps workflows can help you map cloud resources to their owners using tag values in the <code>{tagArrayName_0}</code> array returned by the *{recommendationsActionName_0}* action. Subsequent workflow steps may add owners or departments to the preconfigured [*Tag-owner mapping* table](/reporting-analytics/tables#tag-owner-mapping).

If your {productName_0} instance returns specific owners, your workflow can add their contact details to the *Tag-owner mapping* table automatically. If it does not, you can populate the table manually once for each business unit to ensure that subsequent workflow runs know which team member should receive notifications or approval requests.

For an example of implementing owner mapping as a separate workflow, see [Creating a workflow to fill the project-owner mapping table](/integrations/cloudhealth#creating-a-workflow-to-fill-the-project-owner-mapping-table) in the CloudHealth integration guide. While the guide covers a different FinOps product, the principles of owner mapping apply to {productName_0} workflows as well.

### Recommendation tracking using OpenOps tables and states

Rather than acting on each recommendation once and then losing track of its status, your OpenOps workflow can log {productName_0} recommendations to the preconfigured [*Opportunities* table](/reporting-analytics/tables#opportunities) for centralized tracking and status management.

Workflows using the *{recommendationsActionName_0}* action can create or update table records with details such as estimated savings, resource IDs, recommendation types, and current status (*Created*, *Under Review*, *Dismissed*, *Snoozed*). This approach prevents duplicate notifications, provides audit trails, and enables reporting on realized vs. unrealized savings across your organization.

Learn how to implement opportunity tracking by following the [CloudHealth recommendation logging workflow](/integrations/cloudhealth#look-up-the-opportunity-in-the-openops-table).

### Handling recommendations via Slack

For recommendations that require human judgment, OpenOps can send interactive Slack messages that allow resource owners to approve, dismiss, or snooze optimization opportunities directly from Slack.

After retrieving recommendations with *{recommendationsActionName_0}*, workflows can use owner mapping to identify the appropriate Slack user, then send a Slack message with buttons for different responses using *Request Action* in the Slack action block. Based on the user's decision, the workflow can mark the recommendation as rejected, delay the recommendation using the *{snoozeActionName_0}* action, or proceed with remediation using OpenOps actions for the [cloud provider](/cloud-access/supported-cloud-providers) involved. Decisions can be tracked in the *Opportunities* table.

See [Send a Slack notification with action buttons](/integrations/cloudhealth#send-a-slack-notification-with-action-buttons) in the CloudHealth guide for implementation details.
