# What one Savings Plan commitment would have done

> Replays a commitment in dollars an hour over the payer's recent daily bill: the eligible on-demand spend it would have covered, the commitment it would have left unused, its utilization, coverage and monthly savings, day by day, beside the sized profiles and AWS's own figure. A day averages its hours, so every figure is an upper bound on the hourly truth. Free to every organization; never calls AWS. A Database plan is sold for 12 months No Upfront only. payer_account_id may be omitted when the organization has one payer. Missing data answers 200 with unavailable_reason.

Source: https://docs.levelfour.ai/api-reference/commitments/get-commitments-purchase-simulation


## GET /api/v1/commitments/purchase-simulation

Replays a commitment in dollars an hour over the payer's recent daily bill: the eligible on-demand spend it would have covered, the commitment it would have left unused, its utilization, coverage and monthly savings, day by day, beside the sized profiles and AWS's own figure. A day averages its hours, so every figure is an upper bound on the hourly truth. Free to every organization; never calls AWS. A Database plan is sold for 12 months No Upfront only. payer_account_id may be omitted when the organization has one payer. Missing data answers 200 with unavailable_reason.

### Authentication

Send `Authorization: Bearer <token>`.

### Parameters

- `plan_type` (query, one of `compute`, `database`, required)
- `commitment_hourly` (query, number, required)
- `term_months` (query, one of `12`, `36`, default `12`)
- `payment_option` (query, string, default `no_upfront`)
- `payer_account_id` (query, string, nullable)
- `lookback_days` (query, one of `30`, `60`, default `60`)
- `curve` (query, boolean, default `false`)

### Responses

#### 200: Successful Response

- `success` (boolean, default `true`)
- `timestamp` (date-time string)
- `data` (object, required)
  - `grain` (`daily`, default `daily`)
  - `source` (`cur`, default `cur`)
  - `basis` (`public_on_demand`, default `public_on_demand`)
  - `currency` (`USD`, default `USD`)
  - `payer_account_id` (string, nullable, required)
  - `plan_type` (one of `compute`, `database`, required)
  - `term_months` (integer, required)
  - `payment_option` (one of `all_upfront`, `partial_upfront`, `no_upfront`, required)
  - `unavailable_reason` (one of `schema_pending`, `no_cur`, `insufficient_history`, `rates_pending`, `payer_not_connected`, `no_on_demand_equivalent`, nullable, required)
  - `window` (object, nullable, required)
    - `first_day` (date string, required)
    - `last_day` (date string, required)
    - `days` (integer, required)
    - `missing_days` (integer, required)
    - `last_loaded` (date string, required)
  - `caveats` (array of string, required)
  - `profiles` (object, nullable)
    - `conservative` (object, required)
      - `commitment_hourly` (number, required)
      - `uncapped_hourly` (number, required)
      - `percentile` (number, required)
      - `capped_by` (array of string, required)
      - `utilization_pct` (number, nullable, required)
      - `coverage_pct` (number, nullable, required)
      - `net_savings_monthly` (number, required)
      - `net_savings_monthly_at_your_rates` (number, required)
    - `balanced` (object, required)
      - `commitment_hourly` (number, required)
      - `uncapped_hourly` (number, required)
      - `percentile` (number, required)
      - `capped_by` (array of string, required)
      - `utilization_pct` (number, nullable, required)
      - `coverage_pct` (number, nullable, required)
      - `net_savings_monthly` (number, required)
      - `net_savings_monthly_at_your_rates` (number, required)
    - `max_savings` (object, required)
      - `commitment_hourly` (number, required)
      - `uncapped_hourly` (number, required)
      - `percentile` (number, required)
      - `capped_by` (array of string, required)
      - `utilization_pct` (number, nullable, required)
      - `coverage_pct` (number, nullable, required)
      - `net_savings_monthly` (number, required)
      - `net_savings_monthly_at_your_rates` (number, required)
  - `profiles_inverted` (boolean, default `false`)
  - `guards` (array of object)
    - `name` (string, required)
    - `limit` (number, required)
    - `applied` (boolean, required)
    - `basis` (string, required)
  - `aws` (object, nullable)
    - `hourly_commitment_to_purchase` (number, required)
    - `cap` (number, required)
    - `cap_basis` (one of `direct`, `converted_from_12_no_upfront`, required)
    - `cap_applied` (boolean, required)
    - `lookback_days` (integer, required)
    - `fetched_on` (date string, required)
    - `generated_at` (date-time string, required)
    - `min_hourly_on_demand` (number, nullable, required)
    - `avg_hourly_on_demand` (number, nullable, required)
    - `estimated_utilization_pct` (number, nullable, required)
    - `estimated_monthly_savings` (number, nullable, required)
    - `basis_check_pct` (number, nullable, required)
    - `basis_check_flagged` (boolean, required)
    - `gap` (array of object, required)
      - `code` (one of `ledger_claims`, `eligibility_scope`, `daily_grain`, `lookback_edge`, required)
      - `commitment_hourly` (number, nullable, required)
  - `ledger` (array of object)
    - `source` (one of `queued_plan`, `recent_plan`, `accepted_purchase`, `recent_reservation`, `renewal_growth`, required)
    - `reference` (string, required)
    - `commitment_hourly` (number, nullable, required)
    - `on_demand_hourly` (number, nullable, required)
    - `scope` (object, nullable, required)
      - `family` (string, required)
      - `region` (string, required)
    - `effective_from` (date string, nullable, required)
  - `ledger_hourly` (number, default `0`)
  - `stale_claims` (array of object)
    - `reference` (string, required)
    - `commitment_hourly` (number, nullable, required)
    - `on_demand_hourly` (number, nullable)
    - `accepted_days_ago` (integer, required)
  - `unmapped_holders` (array of string)
  - `window_changes` (array of object)
    - `reference` (string, required)
    - `kind` (string, required)
    - `change` (one of `started`, `ended`, required)
    - `day` (date string, required)
  - `excluded` (array of object)
    - `reason` (string, required)
    - `on_demand_daily` (number, required)
  - `candidate` (object, required)
    - `commitment_hourly` (number, required)
  - `totals` (object, nullable)
    - `eligible_on_demand` (number, required)
    - `covered_on_demand` (number, required)
    - `uncovered_on_demand` (number, required)
    - `commitment_cost` (number, required)
    - `used_commitment` (number, required)
    - `wasted_commitment` (number, required)
    - `utilization_pct` (number, nullable, required)
    - `coverage_pct` (number, nullable, required)
    - `net_savings_monthly` (number, required)
    - `net_savings_monthly_at_your_rates` (number, required)
  - `series` (array of object)
    - `day` (date string, required)
    - `eligible_on_demand` (number, required)
    - `covered_on_demand` (number, required)
    - `uncovered_on_demand` (number, required)
    - `used_commitment` (number, required)
    - `wasted_commitment` (number, required)
    - `commitment_equivalent_hourly` (number, required)
  - `curve` (array of object)
    - `commitment_hourly` (number, required)
    - `net_savings_monthly` (number, required)
    - `utilization_pct` (number, nullable, required)

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