---
title: "Find cheaper CI runners"
method: POST
path: "/v1/recommendations/runner"
tags: ["recommendations"]
---

# Find cheaper CI runners

`POST /v1/recommendations/runner`

## Request

- Base URL: `https://pricing.baselinehq.cloud`
- URL: `https://pricing.baselinehq.cloud/v1/recommendations/runner`
- Auth: one of:
  - API key in header `X-API-Key`
  - API key in header `Authorization`
- TypeScript: <https://skmtc.dev/baselinehq/apis/costgraph-pricing-api/docs/v1/recommendations/runner/post.ts> (a function with typed inputs; its response is checked against the schema)

Prices the given CI jobs on every runner provider that fits the shape, using each provider's own billing granularity (per-minute round-up, per-second, minimums), plus self-hosted compute when self_hosted names a cloud and region. Results are cheapest first. Flags explain caveats such as self-hosted runners on public repositories or savings that need per-job durations to count.

## Request body

- RunnerRecommendationRequest
  - `billed_minutes` number
  - `current` TypesRunnerCurrent
    - `cost` number
    - `provider` string
    - `sku` string
  - `job_count` integer
  - `jobs_seconds` number[]
  - `monthly_minutes` number
  - `public_repo` boolean
  - `self_hosted` TypesRunnerSelfHosted
    - `github_self_hosted_fee` boolean
    - `provider` string
    - `region` string
  - `shape` TypesRunnerShape
    - `arch` string
    - `cpu_cores` integer
    - `gpu_count` integer
    - `os` string
    - `ram_gb` number

## Response `200`

One candidate per provider, cheapest first

- RunnerRecommendation[]
  - `billed_seconds` number
  - `compute_source` string
  - `cost` number
  - `cost_per_month` number
  - `fetched_on` string
  - `flags` string[]
  - `plan_fees` TypesRunnerPlanFee[]
    - `fee` number
    - `per` string
    - `period` string
    - `plan` string
  - `pricing_model` string
  - `provider` string
  - `runtime_seconds` number
  - `savings_vs_current` number
  - `sku` string
  - `source_url` string
  - `vm_instance_type` string

## Other responses

- `400`: Invalid request body
- `401`: Missing or invalid credentials
- `404`: No runner matches the shape
- `422`: Invalid field
- `500`: Internal error

## Changes

- **2026-10-05** `506d14bb78ca`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/baselinehq/apis/costgraph-pricing-api/changes/v1/recommendations/runner/post.md)

---

[API](https://skmtc.dev/baselinehq/apis/costgraph-pricing-api.md) - [All operations](https://skmtc.dev/baselinehq/apis/costgraph-pricing-api/llms.txt) - [OpenAPI document](https://skmtc.dev/baselinehq/apis/costgraph-pricing-api/revisions/506d14bb78ca?raw)
