openapi: 3.1.0
info:
description: '### Welcome to the Archera.ai API documentation.
Archera.ai empowers organizations to optimize cloud costs and automate cloud financial operations. Our API enables seamless integration with your internal tools, workflows, and reporting systems. With this API, you can programmatically access commitment plans, metrics, and more, unlocking the full potential of your cloud data.
Whether you''re building custom dashboards, automating cost management, or integrating with third-party platforms, the Archera.ai API provides secure and reliable endpoints to help you achieve your goals.
If you have questions or need support, please contact our team at support@archera.ai.
## API Key Access
To use this API, you need an API key.
### How to Create an API Key
1. Log in to the Archera.ai web application.
2. Navigate to **User Settings > API Access**.
Open Settings
3. Click **Create New API Key**.
4. Copy and securely store your new API key.
### How to Use Your API Key
Use the `x-api-key` header:
```bash
curl -H ''x-api-key: YOUR_API_KEY'' https://api.archera.ai/v1/org/{org_id}/metrics?provider=aws
```
Keep your API key secure. If you believe your key has been compromised, deactivate it in the web application and generate a new one.
### How to find your Organization ID
1. Log in to the Archera.ai web application.
2. Navigate to **User Settings > Organization**.
3. Your Organization ID is displayed at the top of the page. You can also find it in the URL when visiting the Archera app `&orgId=`
'
title: Archera.ai Commitment Plans Exchanges API
version: v1.0.0
tags:
- name: Exchanges
description: API for commitment exchange recommendations
paths:
/v1/org/{org_id}/exchanges/recommendations:
parameters:
- in: path
name: org_id
required: true
schema:
type: string
format: uuid
get:
parameters:
- in: query
name: provider
description: Cloud provider (aws, azure, gcp)
schema:
example: aws
type: string
enum:
- aws
- azure
- gcp
required: true
- in: query
name: plan_id
description: Optional commitment plan ID to use for plan-derived exchange purchases. When omitted, the endpoint prefers the latest calculated 'Recommended RIs Only' default plan for the provider-resources segment — a twin of the Recommended plan without savings plans, which cannot be exchanged — falling back to the same Recommended default plan selected by GET /commitment-plans/recommended when that plan does not exist yet. Responses may also include non-plan-derived native-to-GRI exchanges.
schema:
type:
- string
- 'null'
format: uuid
default: null
required: false
- in: query
name: commitment_ids
description: Optional explicit Azure commitment IDs to consider returning. When omitted, the exchanger detects underutilized exchange candidates from the default 3-day DailyUtilization lookback. Explicit commitments without utilization rows in that lookback are excluded. Mutually exclusive with plan_id.
schema:
type:
- array
- 'null'
default: null
items:
type: string
format: uuid
required: false
explode: true
style: form
responses:
'422':
$ref: '#/components/responses/UNPROCESSABLE_CONTENT'
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/ExchangeRecommendationsResponse'
'400':
description: Bad Request
'204':
description: No Content
default:
$ref: '#/components/responses/DEFAULT_ERROR'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
'404':
description: Not found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
'405':
description: Method not allowed
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
tags:
- Exchanges
summary: Get Azure exchange recommendations
description: Returns Azure reservation exchange recommendations using the same recommendation logic as the beta exchange endpoint, including plan-derived exchanges and eligible same-SKU 1-year native to 1-year GRI exchanges. When plan_id is omitted, the endpoint prefers the latest calculated 'Recommended RIs Only' default plan for the provider-resources segment (a twin of the Recommended plan without savings plans, which cannot be exchanged), falling back to the Recommended default plan when that plan does not exist yet. Currently only provider=azure is supported.
/v1/org/{org_id}/exchanges/recommendations/apply:
parameters:
- in: path
name: org_id
required: true
schema:
type: string
format: uuid
post:
responses:
'422':
$ref: '#/components/responses/UNPROCESSABLE_CONTENT'
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/ApplyExchangeRecommendationsResponse'
'400':
description: Bad Request
default:
$ref: '#/components/responses/DEFAULT_ERROR'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
'404':
description: Not found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
'405':
description: Method not allowed
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ApplyExchangeRecommendationsArgs'
tags:
- Exchanges
summary: Apply Azure exchange recommendations
description: Requests application of one Azure reservation exchange recommendation using the same explicit purchase and return item body as the beta exchange endpoint. Currently only provider=azure is supported.
components:
schemas:
ExchangeReturnedCommitmentDailyUtilization:
type: object
properties:
date:
type: string
format: date
description: DailyUtilization date.
utilization:
type: number
description: Whole-commitment utilization of the returned commitments for this date (0-1), dollar weighted by each return's commitment cost.
required:
- date
- utilization
additionalProperties: false
ApiErrorResponse:
type: object
properties:
message:
type: string
detail: {}
code:
type:
- string
- 'null'
url:
type:
- string
- 'null'
timestamp:
type: string
type:
type: string
required:
- message
- timestamp
- type
CommitmentCostBreakdown:
type: object
properties:
cloud_provider_cost:
$ref: '#/components/schemas/CloudProviderCost'
archera_premium:
type: number
description: Archera premium — paid to Archera, equal to a portion of the savings Archera generates for this commitment (fee_rate * gross savings, only charged when gross > 0). Already included in commitment_cost.total (don't add on top). Because premium is only a fraction of gross, whenever archera_premium > 0 the commitment is net-positive after the fee. Native (non-Archera) commitments have premium = 0 and offer no such guarantee; an underutilized guaranteed commitment pre-lockin can also show net < 0 (the rebate that covers this kicks in post-lockin).
additionalProperties: false
ApplyExchangePurchase:
type: object
properties:
offer_id:
type: string
format: uuid
description: Azure reservation offer ID to purchase.
quantity:
type: integer
minimum: 1
description: Quantity of this offer to purchase.
required:
- offer_id
- quantity
additionalProperties: false
ExchangePurchase:
type: object
properties:
account_id:
type:
- string
- 'null'
description: Target cloud account/subscription for the purchase.
contract_term:
description: User-facing purchase commitment term. For leased/guaranteed purchases this is the lease lock-in term; for native purchases it is the offer duration.
type:
- string
- 'null'
enum:
- one_year_gris
- thirty_day_gris
- two_month_gris
- three_month_gris
- four_month_gris
- five_month_gris
- six_month_gris
- seven_month_gris
- eight_month_gris
- nine_month_gris
- ten_month_gris
- eleven_month_gris
- twelve_month_gris
- thirteen_month_gris
- fourteen_month_gris
- fifteen_month_gris
- sixteen_month_gris
- seventeen_month_gris
- eighteen_month_gris
- nineteen_month_gris
- twenty_month_gris
- twenty_one_month_gris
- twenty_two_month_gris
- twenty_three_month_gris
- twenty_four_month_gris
- twenty_five_month_gris
- twenty_six_month_gris
- twenty_seven_month_gris
- twenty_eight_month_gris
- twenty_nine_month_gris
- thirty_month_gris
- thirty_one_month_gris
- thirty_two_month_gris
- thirty_three_month_gris
- thirty_four_month_gris
- thirty_five_month_gris
- one_year
- two_year
- three_year
- five_year
- zero_day
- thirty_day
- two_month
- three_month
- four_month
- five_month
- six_month
- seven_month
- eight_month
- nine_month
- ten_month
- eleven_month
- thirteen_month
- fourteen_month
- fifteen_month
- sixteen_month
- seventeen_month
- eighteen_month
- nineteen_month
- twenty_month
- twenty_one_month
- twenty_two_month
- twenty_three_month
- twenty_five_month
- twenty_six_month
- twenty_seven_month
- twenty_eight_month
- twenty_nine_month
- thirty_month
- thirty_one_month
- thirty_two_month
- thirty_three_month
- thirty_four_month
- thirty_five_month
- null
lease_menu_item_id:
type:
- string
- 'null'
format: uuid
description: Lease menu item attached to the purchase side, or null for native purchases.
quantity:
type: integer
description: Quantity of the Azure reservation to purchase.
offer:
description: Azure reservation offer being purchased.
$ref: '#/components/schemas/CommitmentOffer'
commitment_upfront_cost:
type: number
description: One-time upfront dollars required at signing for the purchase side. NOT a monthly rate.
commitment_financials_monthly_rate:
description: Purchase-side plan line item economics as 730-hour monthly rates.
$ref: '#/components/schemas/CommitmentFinancialsNoRebate'
required:
- commitment_financials_monthly_rate
- commitment_upfront_cost
- offer
- quantity
additionalProperties: false
Commitment:
type: object
properties:
id:
type: string
format: uuid
description: Unique commitment identifier
provider_reservation_id:
type: string
description: Cloud provider's ID for this commitment (e.g. AWS reservation ID)
provider:
description: Cloud provider (aws, azure, gcp)
type: string
enum:
- aws
- azure
- gcp
display_name:
type: string
description: Human-readable commitment name
guaranteed_display_name:
type: string
description: Commitment name when held as an Archera Guaranteed Commitment
type:
type: string
description: Commitment type (e.g. 'Compute', 'EC2Instance', 'RDS')
status:
description: Commitment status (e.g. 'active', 'expired', 'queued')
type: string
enum:
- active
- locked
- new
- reselling
- unlocked
- unknown
- cancelled
- expired
- recently_expired
- resold
- removed
is_active:
type: boolean
description: Whether the commitment is currently active
is_archera_guaranteed:
type: boolean
description: Whether this is an Archera Guaranteed Commitment
account_id:
type:
- string
- 'null'
description: Cloud account ID this commitment is in
billing_account_id:
type:
- string
- 'null'
description: Billing/management account ID
start_date:
type:
- string
- 'null'
format: date-time
description: When the commitment started
end_date:
type:
- string
- 'null'
format: date-time
description: When the commitment expires
duration_seconds:
type:
- integer
- 'null'
description: Total commitment duration in seconds
guarantee_start:
type:
- string
- 'null'
format: date-time
description: When the Archera guarantee period started
guarantee_lockin_date:
type:
- string
- 'null'
format: date-time
description: When the Archera guarantee lock-in period ends
guarantee_method:
readOnly: true
description: 'How the Archera guarantee is delivered. ''rebate'': Archera rebates the cost of the unused commitment directly to the user (as cash or credit toward Archera premiums). ''release'': Archera takes over the commitment along with remaining payment obligations. Null for non-guaranteed commitments.'
region:
type:
- string
- 'null'
description: Cloud region (e.g. 'us-east-1')
instance_type:
type:
- string
- 'null'
description: Instance type (e.g. 'm5.xlarge')
instance_family:
type:
- string
- 'null'
description: Instance family (e.g. 'm5')
plan_type:
type:
- string
- 'null'
description: Plan type (e.g. 'Compute', 'EC2Instance')
payment_option:
description: Payment option (e.g. 'no_upfront', 'partial_upfront', 'all_upfront')
type:
- string
- 'null'
enum:
- no_upfront
- partial_upfront
- all_upfront
- null
offering_class:
description: Offering class (e.g. 'standard', 'convertible')
type:
- string
- 'null'
enum:
- standard
- convertible
- null
is_flexible:
type:
- boolean
- 'null'
description: Whether the commitment has instance size flexibility
instance_count:
type:
- integer
- 'null'
description: Number of instances covered
contract_term:
description: Contract term (e.g. 'thirty_day_gris', 'one_year')
type:
- string
- 'null'
enum:
- one_year_gris
- thirty_day_gris
- two_month_gris
- three_month_gris
- four_month_gris
- five_month_gris
- six_month_gris
- seven_month_gris
- eight_month_gris
- nine_month_gris
- ten_month_gris
- eleven_month_gris
- twelve_month_gris
- thirteen_month_gris
- fourteen_month_gris
- fifteen_month_gris
- sixteen_month_gris
- seventeen_month_gris
- eighteen_month_gris
- nineteen_month_gris
- twenty_month_gris
- twenty_one_month_gris
- twenty_two_month_gris
- twenty_three_month_gris
- twenty_four_month_gris
- twenty_five_month_gris
- twenty_six_month_gris
- twenty_seven_month_gris
- twenty_eight_month_gris
- twenty_nine_month_gris
- thirty_month_gris
- thirty_one_month_gris
- thirty_two_month_gris
- thirty_three_month_gris
- thirty_four_month_gris
- thirty_five_month_gris
- one_year
- two_year
- three_year
- five_year
- zero_day
- thirty_day
- two_month
- three_month
- four_month
- five_month
- six_month
- seven_month
- eight_month
- nine_month
- ten_month
- eleven_month
- thirteen_month
- fourteen_month
- fifteen_month
- sixteen_month
- seventeen_month
- eighteen_month
- nineteen_month
- twenty_month
- twenty_one_month
- twenty_two_month
- twenty_three_month
- twenty_five_month
- twenty_six_month
- twenty_seven_month
- twenty_eight_month
- twenty_nine_month
- thirty_month
- thirty_one_month
- thirty_two_month
- thirty_three_month
- thirty_four_month
- thirty_five_month
- null
required:
- id
- provider
additionalProperties: false
Error:
type: object
properties:
code:
type: integer
description: Error code
status:
type: string
description: Error name
message:
type: string
description: Error message
errors:
type: object
description: Errors
additionalProperties: {}
additionalProperties: false
CloudProviderCost:
type: object
properties:
total:
type: number
description: Amortized cost paid to the cloud provider. Sums with archera_premium to reach cost.total.
breakdown:
description: Optional. Additive payment-cadence decomposition of total (recurring + amortized_upfront). Present only when purchase-term structure is known (individual commitment or plan).
$ref: '#/components/schemas/CloudProviderCostBreakdown'
additionalProperties: false
ApplyExchangeRecommendationsArgs:
type: object
properties:
provider:
description: Cloud provider (aws, azure, gcp)
example: aws
type: string
enum:
- aws
- azure
- gcp
purchases:
type: array
minItems: 1
description: Explicit purchase-side line items for one exchange recommendation.
items:
$ref: '#/components/schemas/ApplyExchangePurchase'
returns:
type: array
minItems: 1
description: Explicit return-side line items for one exchange recommendation.
items:
$ref: '#/components/schemas/ApplyExchangeReturn'
required:
- provider
- purchases
- returns
additionalProperties: false
ApplyExchangeReturn:
type: object
properties:
commitment_id:
type: string
format: uuid
description: Existing Azure commitment ID to return.
quantity:
type: integer
minimum: 1
description: Quantity of this commitment to return.
required:
- commitment_id
- quantity
additionalProperties: false
CommitmentCost:
type: object
properties:
total:
type: number
description: Total paid (cloud_provider_cost.total + archera_premium). Headline 'cost'.
breakdown:
$ref: '#/components/schemas/CommitmentCostBreakdown'
additionalProperties: false
CommitmentSavings_Exclude_Rebate:
type: object
properties:
net:
type: number
description: Net savings after Archera premium, including any rebate. Actual bill reduction. Headline 'savings'.
gross:
type: number
description: Savings before Archera premium. Equals covered_ondemand_cost - commitment_cost.breakdown.cloud_provider_cost.total.
additionalProperties: false
ExchangeRecommendationDelta:
type: object
properties:
monthly_net_savings:
type: number
description: Purchase monthly net savings minus returned commitments' monthly net savings. Positive means the exchange purchase saves more per 730-hour month.
monthly_commitment_cost:
type: number
description: Purchase monthly commitment cost minus returned commitments' monthly commitment cost. Positive means more monthly commitment spend.
purchase_upfront_cost:
type: number
description: Purchase-side one-time upfront cost only. Not netted against returned commitments because returned financials are monthly-rate utilization actuals and have no upfront component. NOT a rate.
required:
- monthly_commitment_cost
- monthly_net_savings
- purchase_upfront_cost
additionalProperties: false
ApplyExchangeRecommendationsResponse:
type: object
properties:
status:
type: string
description: Application status for the exchange recommendations.
recommendation_count:
type: integer
description: Number of exchange recommendations applied.
required:
- recommendation_count
- status
additionalProperties: false
ExchangeRecommendation:
type: object
properties:
purchase_lifetime_commitment:
type: number
description: Lifetime Azure commitment value of the purchase side.
returned_lifetime_commitment:
type: number
description: Lifetime Azure commitment value returned by the exchange.
additional_lifetime_commitment:
type: number
description: Purchase lifetime commitment minus returned lifetime commitment. Azure exchange policy requires this to be non-negative.
purchase:
$ref: '#/components/schemas/ExchangePurchase'
returns:
type: array
items:
$ref: '#/components/schemas/ExchangeReturn'
purchase_commitment_financials_monthly_rate:
description: Purchase-side monthly-rate financials.
$ref: '#/components/schemas/CommitmentFinancialsNoRebate'
returned_commitment_financials_monthly_rate:
description: Returned commitments' rolled-up monthly-rate financials for the selected integer return quantities. Cost comes from DailyUtilization commitment cost, and savings are computed after assigning as much utilization as possible to the quantity that remains committed. Rebate and Archera premium are excluded from exchange recommendations and are not included in net savings.
$ref: '#/components/schemas/CommitmentFinancialsNoRebate'
returned_commitment_daily_utilizations:
type: array
description: Daily whole-commitment utilization for the returned commitments, dollar weighted by each return's commitment cost. Use this for exchange-level utilization charts.
items:
$ref: '#/components/schemas/ExchangeReturnedCommitmentDailyUtilization'
reason:
type:
- string
- 'null'
description: Short human-readable reason this exchange was recommended, based on how the exchanger generated it.
delta_vs_returned:
description: Purchase-side economics compared with returned-commitment economics. Monthly fields are purchase-side minus returned-side; purchase_upfront_cost is purchase-side one-time upfront only and is not netted. Purchase financials come from plan-amortized line item financials; returned financials come from DailyUtilization cost and covered usage for the selected integer return quantities, normalized to 730-hour monthly rates.
$ref: '#/components/schemas/ExchangeRecommendationDelta'
required:
- additional_lifetime_commitment
- delta_vs_returned
- purchase
- purchase_commitment_financials_monthly_rate
- purchase_lifetime_commitment
- returned_commitment_daily_utilizations
- returned_commitment_financials_monthly_rate
- returned_lifetime_commitment
- returns
additionalProperties: false
CommitmentOffer:
type: object
properties:
id:
type: string
format: uuid
description: Offer identifier
provider:
description: Cloud provider (aws, azure, gcp)
type: string
enum:
- aws
- azure
- gcp
type:
type: string
description: Commitment type (e.g. 'ri', 'savings_plan', 'cud')
region:
type:
- string
- 'null'
description: Cloud region (e.g. 'us-east-1')
duration_seconds:
type: integer
description: Total commitment duration in seconds
instance_type:
type:
- string
- 'null'
description: Instance type (e.g. 'm5.xlarge'), null for Savings Plans
instance_family:
type:
- string
- 'null'
description: Instance family (e.g. 'm5'), null for some commitment types
offering_class:
description: Offering class (e.g. 'standard', 'convertible')
type:
- string
- 'null'
enum:
- standard
- convertible
- null
payment_option:
description: Payment option (e.g. 'no_upfront', 'partial_upfront', 'all_upfront')
type:
- string
- 'null'
enum:
- no_upfront
- partial_upfront
- all_upfront
- null
plan_type:
type:
- string
- 'null'
description: Plan type (e.g. 'Compute', 'EC2Instance')
product_description:
type:
- string
- 'null'
description: Product description (e.g. 'Linux/UNIX')
display_name:
type:
- string
- 'null'
description: Human-readable offer name
guaranteed_display_name:
type:
- string
- 'null'
description: Offer name when purchased as an Archera Guaranteed Commitment
is_flexible:
type:
- boolean
- 'null'
description: Whether the commitment has instance size flexibility
additionalProperties: false
CommitmentFinancialsNoRebate:
type: object
properties:
commitment_cost:
$ref: '#/components/schemas/CommitmentCost'
commitment_savings:
$ref: '#/components/schemas/CommitmentSavings_Exclude_Rebate'
covered_ondemand_cost:
type: number
description: On-demand cost of usage covered by commitments — baseline for savings. NOT a cost paid by the user. Equals commitment_cost.breakdown.cloud_provider_cost.total + commitment_savings.gross.
additionalProperties: false
ExchangeRecommendationsResponse:
type: object
properties:
current_utilization_lookback_days:
type: integer
description: Number of trailing days of DailyUtilization used for returned-commitment utilization and financials.
data:
type: array
description: Azure exchange recommendations.
items:
$ref: '#/components/schemas/ExchangeRecommendation'
required:
- current_utilization_lookback_days
- data
additionalProperties: false
CloudProviderCostBreakdown:
type: object
properties:
recurring:
type: number
description: Recurring monthly payment to the cloud provider.
amortized_upfront:
type: number
description: Monthly share of the upfront payment, amortized over the term.
additionalProperties: false
ExchangeReturn:
type: object
properties:
commitment:
description: Azure commitment proposed to return in the exchange.
$ref: '#/components/schemas/Commitment'
quantity:
type: integer
description: Quantity of this commitment proposed for return.
remaining_lifetime_commitment:
type: number
description: Remaining Azure commitment value returned for this commitment quantity. This is lifetime exchange value, not a monthly rate.
utilization:
type: number
description: Whole-commitment utilization of the returned commitment over the DailyUtilization period (0-1).
underutilized_commitment_cost:
type: number
description: Estimated underutilized commitment cost over the DailyUtilization period. This is a period total, not a monthly rate.
utilization_days:
type: integer
description: Number of DailyUtilization days behind the utilization fields.
reservation_resource_id:
type: string
description: Azure reservation resource ID required by Azure exchange APIs.
commitment_financials_monthly_rate:
description: Returned commitment economics as a 730-hour monthly rate for the selected integer return quantity. Cost comes from DailyUtilization commitment cost for the response period, scaled to the returned quantity. Savings are computed after assigning as much utilization as possible to the quantity that remains committed, so returned fully-utilized quantities can have positive savings and underutilized quantities have negative savings. Archera premium and rebate are excluded from exchange recommendations and are not included in net savings.
$ref: '#/components/schemas/CommitmentFinancialsNoRebate'
required:
- commitment
- commitment_financials_monthly_rate
- quantity
- remaining_lifetime_commitment
- reservation_resource_id
- underutilized_commitment_cost
- utilization
- utilization_days
additionalProperties: false
responses:
DEFAULT_ERROR:
description: Default error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
UNPROCESSABLE_CONTENT:
description: Unprocessable Content
content:
application/json:
schema:
$ref: '#/components/schemas/Error'