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

# Price a cluster's current configuration for a what-if draft

> Prices what the cluster runs today - its node groups (from the machines Ankra provisioned, or the synced nodes grouped by pool) and load balancers - from the same price book or rate card the metering loop bills from, in the caller's display currency. The estimate echoes the baseline so a draft can start from it. Bearer-PAT twin of the browser route of the same name under /org.



## OpenAPI

````yaml https://platform.ankra.app/openapi.json get /api/v1/org/clusters/{cluster_id}/cost/estimate
openapi: 3.1.0
info:
  title: FastAPI
  version: 0.1.0
servers:
  - url: https://platform.ankra.app
security: []
tags:
  - name: Organisation IAM
    description: >-
      Custom organisation roles and scoped role assignments for member and
      service-account identities.
  - name: Clusters
    description: Create, inspect and manage clusters, and the stacks deployed on them.
  - name: Managed Clusters
    description: Provider-managed control planes, driven through one common surface.
  - name: Imported Clusters
    description: Clusters that already existed and were connected to Ankra.
  - name: Cluster Access
    description: Kubeconfigs, service-account tokens and per-cluster access grants.
  - name: Kubernetes
    description: Read and act on the Kubernetes objects inside a cluster.
  - name: AWS Clusters
    description: >-
      Provision and manage self-managed k3s / kubeadm clusters on AWS EC2 in
      your own VPC.
  - name: Ankra Cloud Clusters
    description: >-
      Provision and manage self-managed kubeadm / k3s clusters on Ankra Cloud
      servers: a private network, a NAT router and a bastion per cluster.
  - name: DigitalOcean Clusters
    description: Provision and manage DigitalOcean Kubernetes clusters.
  - name: Hetzner Clusters
    description: Provision and manage Hetzner Kubernetes clusters.
  - name: OVH Clusters
    description: Provision and manage OVH Kubernetes clusters.
  - name: Scaleway Clusters
    description: Provision and manage Scaleway Kapsule clusters.
  - name: UpCloud Clusters
    description: Provision and manage UpCloud Kubernetes clusters.
  - name: Applications
    description: Deploy, configure and observe applications across the fleet.
  - name: Pipelines
    description: Pipeline definitions and the approval of the authority they declare.
  - name: Backups
    description: >-
      Backup vaults, restore points, protection posture and captures for stacks
      and application deployments; a completed capture is not a verified
      restore.
  - name: Stack Profiles
    description: Reusable stack definitions, their versions and sharing.
  - name: Services
    description: >-
      Versioned service packages and explicit sharing. Runtime admission is
      separate from publication.
  - name: Charts
    description: Browse the chart catalogue behind stacks and addons.
  - name: Helm
    description: Helm registries, credentials and the charts they expose.
  - name: Executions
    description: Long-running platform executions and their jobs.
  - name: Operations
    description: Cancel in-flight cluster operations and their jobs.
  - name: Chat
    description: Conversational sessions, plans and confirmable actions.
  - name: AI Management
    description: >-
      Customer agent lifecycle, authenticated identity and organisation
      automation controls.
  - name: AI Agent Runs
    description: Autonomous agent runs and their outcomes.
  - name: AI Tickets
    description: The AI ticket board, its sync connections and settings.
  - name: AI Playbooks
    description: Reusable playbooks the AI lanes execute.
  - name: AI Conditions
    description: Conditions that gate AI autonomy.
  - name: AI Remediation
    description: >-
      The organisation's auto-remediation policy: what the AI lanes may fix by
      themselves, and who approves the rest.
  - name: AI Engineering Handoffs
    description: Work the AI lanes escalate to a human engineer.
  - name: AI Environment
    description: The environment and base stacks AI demos deploy into.
  - name: Security
    description: Findings, advisories, SBOMs, compliance and posture.
  - name: Cost
    description: Cluster and fleet cost, rate cards and cost settings.
  - name: Decisions
    description: >-
      The decision ledger behind the Security and Cost queues: proposals a
      surface computed, the approve and set-aside decisions people took on them,
      and the receipts of running them.
  - name: Billing
    description: Subscription and spend caps.
  - name: Organisation
    description: Members, invitations, audit logs and organisation settings.
  - name: Account Tokens
    description: Personal access tokens for the API and CLI.
  - name: Credentials
    description: The shared credential store.
  - name: AWS Credentials
    description: >-
      AWS credentials: access keys or CloudFormation-onboarded STS roles for
      cost, EKS and self-managed provisioning.
  - name: Ankra Cloud Credentials
    description: >-
      Ankra Cloud API tokens, shared by the self-managed and managed Ankra Cloud
      lanes.
  - name: Azure Credentials
    description: Azure credentials and SSH keys.
  - name: DigitalOcean Credentials
    description: DigitalOcean credentials and SSH keys.
  - name: Hetzner Credentials
    description: Hetzner credentials and SSH keys.
  - name: OVH Credentials
    description: OVH credentials and SSH keys.
  - name: Scaleway Credentials
    description: Scaleway credentials.
  - name: UpCloud Credentials
    description: UpCloud credentials and SSH keys.
  - name: Data Source Credentials
    description: Credentials for metrics and log sources.
  - name: DNS Credentials
    description: Credentials for DNS providers.
  - name: Object Storage Buckets
    description: >-
      Buckets Ankra creates and manages on an organisation's own provider
      credentials.
  - name: DNS
    description: DNS zones and records, including custom organisation zones.
  - name: Cloudflare
    description: Cloudflare domains and the credentials behind them.
  - name: Variables
    description: Organisation- and cluster-scoped variables.
  - name: SOPS
    description: Encrypt and decrypt values with the organisation SOPS config.
  - name: Alerts
    description: Alert integrations and ingest credentials.
  - name: Notifications
    description: Notification routes and their delivery targets.
  - name: Support
    description: Support tickets.
  - name: AI Settings
    description: Organisation AI provider, model catalog and per-function model settings
paths:
  /api/v1/org/clusters/{cluster_id}/cost/estimate:
    get:
      tags:
        - Cost
      summary: Price a cluster's current configuration for a what-if draft
      description: >-
        Prices what the cluster runs today - its node groups (from the machines
        Ankra provisioned, or the synced nodes grouped by pool) and load
        balancers - from the same price book or rate card the metering loop
        bills from, in the caller's display currency. The estimate echoes the
        baseline so a draft can start from it. Bearer-PAT twin of the browser
        route of the same name under /org.
      operationId: cluster_cost_estimate_api_v1_org_clusters_get
      parameters:
        - description: PAT organisation override.
          in: header
          name: x-ankra-organisation-id
          required: false
          schema:
            type: string
        - name: cluster_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClusterCostEstimateResponse'
          description: Successful response
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContractDetailError'
          description: >-
            Missing or malformed Authorization header, or a draft the pricing
            cannot honour (out-of-range node count, size or network count)
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContractDetailError'
          description: Unknown, expired, or revoked API token
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContractDetailError'
          description: >-
            Token may not use this surface (MCP-scoped token or service account
            restriction)
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContractDetailError'
          description: Cluster not found in the token's organisation
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
          description: Request validation error
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContractDetailError'
          description: Internal server error
      security:
        - BearerAuth: []
components:
  schemas:
    ClusterCostEstimateResponse:
      properties:
        currency:
          type: string
        pricing:
          $ref: '#/components/schemas/CostEstimatePricing'
        baseline:
          $ref: '#/components/schemas/CostEstimateConfiguration'
        estimate:
          $ref: '#/components/schemas/CostEstimateConfiguration'
        metered_monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
        predicted_monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            The metered run rate plus the change; on a migration the re-priced
            volumes are folded in. Withheld when an unpriced part differs
            between the two sides.
        delta_monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
        target_provider:
          description: >-
            The provider the estimate was priced on when the draft asked for a
            migration; empty otherwise.
          type: string
        target_pricing:
          anyOf:
            - $ref: '#/components/schemas/CostEstimatePricing'
            - type: 'null'
          description: >-
            The migration target's source and unit prices; pricing keeps the
            cluster's own.
        available_targets:
          description: >-
            Providers a draft may be priced on: those with an offline size
            catalogue and priced rows, the cluster's own excluded.
          items:
            $ref: '#/components/schemas/CostEstimateTarget'
          type: array
        match:
          description: The matching rule the estimate was placed with.
          type: string
        volumes:
          $ref: '#/components/schemas/CostEstimateVolumes'
        priced_delta_monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            The estimate minus the baseline over the lines both sides could
            price (a line priced on one side only is left out of both), answered
            even when the prediction is withheld so a partly priced target keeps
            a floor; null when no line could be compared.
        unitemised:
          $ref: '#/components/schemas/CostEstimateUnitemised'
      required:
        - currency
        - pricing
        - baseline
        - estimate
        - metered_monthly_cents
        - predicted_monthly_cents
        - delta_monthly_cents
        - target_provider
        - target_pricing
        - available_targets
        - match
        - volumes
        - priced_delta_monthly_cents
        - unitemised
      title: ClusterCostEstimateResponse
      type: object
    ContractDetailError:
      example:
        detail: Cluster not found
      properties:
        detail:
          oneOf:
            - type: string
            - additionalProperties: true
              properties: {}
              type: object
      required:
        - detail
      type: object
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          title: Detail
          type: array
      title: HTTPValidationError
      type: object
    CostEstimatePricing:
      properties:
        mode:
          description: catalog | rate_card | derived | unavailable
          type: string
        provider:
          type: string
        source:
          type: string
        reason:
          type: string
        spot_supported:
          type: boolean
        catalog_size_count:
          type: integer
        applied_discount_pct:
          type: number
        vcpu_monthly_amount:
          anyOf:
            - type: number
            - type: 'null'
        memory_gb_monthly_amount:
          anyOf:
            - type: number
            - type: 'null'
        storage_gb_monthly_amount:
          anyOf:
            - type: number
            - type: 'null'
        load_balancer_monthly_amount:
          anyOf:
            - type: number
            - type: 'null'
        nat_gateway_monthly_amount:
          anyOf:
            - type: number
            - type: 'null'
        gateway_monthly_amount:
          anyOf:
            - type: number
            - type: 'null'
        flexible_ip_monthly_amount:
          anyOf:
            - type: number
            - type: 'null'
        public_ipv4_monthly_amount:
          anyOf:
            - type: number
            - type: 'null'
          description: >-
            The monthly price of one instance's public IPv4 where the provider
            bills it on top of compute at the moment of the estimate (OVHcloud
            from 2026-10-01); null where none is billed or the book does not
            carry it.
        local_disk_gb_monthly_amount:
          anyOf:
            - type: number
            - type: 'null'
          description: >-
            The per-GB-month price of the local disk the provider bills on top
            of compute at the moment of the estimate (OVHcloud B3, C3 and R3
            from 2026-10-01); null where none is billed or the book does not
            carry it.
        region:
          type: string
          description: >-
            The region the price book was read in, empty for a provider that
            prices one catalogue for everywhere.
      required:
        - mode
        - provider
        - source
        - reason
        - spot_supported
        - catalog_size_count
        - applied_discount_pct
        - vcpu_monthly_amount
        - memory_gb_monthly_amount
        - storage_gb_monthly_amount
        - load_balancer_monthly_amount
        - nat_gateway_monthly_amount
        - gateway_monthly_amount
        - flexible_ip_monthly_amount
        - public_ipv4_monthly_amount
        - local_disk_gb_monthly_amount
        - region
      title: CostEstimatePricing
      type: object
    CostEstimateConfiguration:
      properties:
        node_groups:
          items:
            $ref: '#/components/schemas/CostEstimateNodeGroup'
          type: array
        control_plane:
          anyOf:
            - $ref: '#/components/schemas/CostEstimateNodeGroup'
            - type: 'null'
          description: >-
            The provisioned control plane priced beside the node groups and
            counted in every total; null where Ankra knows of none (imported
            clusters keep it among the node groups).
        network:
          $ref: '#/components/schemas/CostEstimateNetwork'
        total_node_count:
          type: integer
        priced_node_count:
          type: integer
        compute_monthly_cents:
          type: integer
        storage_monthly_cents:
          type: integer
        network_monthly_cents:
          description: >-
            The network line plus the per-instance public IPv4s the node-group
            lines carry (public_ipv4_monthly_cents), filed where the metering
            loop files them.
          type: integer
        monthly_cents:
          description: Sum of what could be priced.
          type: integer
        coverage_incomplete:
          type: boolean
      required:
        - node_groups
        - control_plane
        - network
        - total_node_count
        - priced_node_count
        - compute_monthly_cents
        - storage_monthly_cents
        - network_monthly_cents
        - monthly_cents
        - coverage_incomplete
      title: CostEstimateConfiguration
      type: object
    CostEstimateTarget:
      properties:
        provider:
          type: string
        title:
          type: string
        size_count:
          type: integer
          description: >-
            How many sizes the target prices; zero on a rate-carded target,
            which places nothing on a size at all.
        region:
          type: string
          description: >-
            The region the target's book was read in, empty where the provider
            prices one catalogue for everywhere.
        source:
          type: string
          description: >-
            Where a rate-carded target's rates come from, in the words the panel
            prints them in; empty on a catalogue target, whose source is the
            provider's price book.
        pricing_mode:
          type: string
          description: >-
            'catalog' when the target places each group on a machine size,
            'rate_card' when it prices capacity per unit.
      required:
        - provider
        - title
        - size_count
        - region
        - source
        - pricing_mode
      title: CostEstimateTarget
      type: object
    CostEstimateVolumes:
      properties:
        count:
          type: integer
        metered_monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            The metered volume storage per month; null before the first cost
            snapshot.
        target_monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            What the same storage would bill on the migration target - the
            metered figure scaled by the two providers' per-GB-month rates; null
            when either side states no volume price, or the draft is not a
            migration.
        volume_type:
          description: >-
            The price-book volume type the cluster's own per-GB rate was read
            from - the provider's default tier; empty where the side states one
            storage rate and no tier.
          type: string
        target_volume_type:
          description: >-
            The price-book volume type the target's per-GB rate was read from;
            empty where the target states one storage rate and no tier.
          type: string
        tier_changed:
          description: >-
            The two volume types are known and different, so the target figure
            is a different class of storage and not a like-for-like re-pricing.
          type: boolean
        note:
          type: string
      required:
        - count
        - metered_monthly_cents
        - target_monthly_cents
        - volume_type
        - target_volume_type
        - tier_changed
        - note
      title: CostEstimateVolumes
      type: object
    CostEstimateUnitemised:
      properties:
        monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            The metered bill less the baseline's own lines and the metered
            volumes; null before the first cost snapshot.
        carried_to_target:
          description: >-
            Whether the prediction kept this remainder. A positive one is
            charges the price book does not itemise, which a migration still
            buys; a negative one is specific to the current bill and is left out
            of another provider's total. Only meaningful alongside
            monthly_cents: with no cost snapshot there is no remainder, so
            monthly_cents is null and this stays true because nothing is held
            back.
          type: boolean
        note:
          type: string
      required:
        - monthly_cents
        - carried_to_target
        - note
      title: CostEstimateUnitemised
      type: object
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          title: Location
          type: array
        msg:
          title: Message
          type: string
        type:
          title: Error Type
          type: string
      required:
        - loc
        - msg
        - type
      title: ValidationError
      type: object
    CostEstimateNodeGroup:
      properties:
        name:
          type: string
        count:
          type: integer
        vcpus:
          type: number
        memory_gb:
          type: number
        disk_gb:
          type: number
        spot:
          type: boolean
        instance_type:
          description: >-
            The size the group runs on or was placed on; empty when nothing
            holds it.
          type: string
        instance_class:
          description: >-
            The vCPU class the provider sells the placed size as: shared,
            dedicated, or empty where the catalogue cannot tell.
          type: string
        instance_vcpus:
          anyOf:
            - type: number
            - type: 'null'
        instance_memory_gb:
          anyOf:
            - type: number
            - type: 'null'
        instance_disk_gb:
          anyOf:
            - type: number
            - type: 'null'
        extra_disk_gb:
          description: >-
            Disk priced as volume storage beyond what the size bundles (all of
            it under a rate card).
          type: number
        unit_monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
        compute_monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
        storage_monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
        public_ipv4s:
          description: >-
            How many public IPv4 addresses the provider bills this group for on
            top of compute: one a node on OVHcloud from 2026-10-01, none
            anywhere else.
          type: integer
        public_ipv4_monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            The public IPv4s priced, counted in the configuration's
            network_monthly_cents rather than in this line's storage. Null when
            public_ipv4s is 0, and null beside a non-zero public_ipv4s when the
            price book cannot price them: the line is then unpriced and its note
            says so.
        local_disk_monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            The local disk the provider bills on top of compute (OVHcloud B3, C3
            and R3 from 2026-10-01), already counted in storage_monthly_cents.
            Null when no disk is billed, and null on a billed disk the book or
            the catalogue cannot price: the line is then unpriced and its note
            names which.
        monthly_cents:
          anyOf:
            - type: integer
            - type: 'null'
        priced:
          description: >-
            False when any part of the line could not be priced; the figures
            then cover only what could.
          type: boolean
        note:
          type: string
      required:
        - name
        - count
        - vcpus
        - memory_gb
        - disk_gb
        - spot
        - instance_type
        - instance_class
        - instance_vcpus
        - instance_memory_gb
        - instance_disk_gb
        - extra_disk_gb
        - unit_monthly_cents
        - compute_monthly_cents
        - storage_monthly_cents
        - public_ipv4s
        - public_ipv4_monthly_cents
        - local_disk_monthly_cents
        - monthly_cents
        - priced
        - note
      title: CostEstimateNodeGroup
      type: object
    CostEstimateNetwork:
      properties:
        load_balancers:
          type: integer
        nat_gateways:
          type: integer
        gateways:
          type: integer
        flexible_ips:
          type: integer
        monthly_cents:
          type: integer
        unpriced_count:
          type: integer
      required:
        - load_balancers
        - nat_gateways
        - gateways
        - flexible_ips
        - monthly_cents
        - unpriced_count
      title: CostEstimateNetwork
      type: object
  securitySchemes:
    BearerAuth:
      bearerFormat: PAT
      scheme: bearer
      type: http

````