---
title: "Cost per session by harness and model"
method: GET
path: "/datasets/session-cost"
tags: ["Datasets"]
---

# Cost per session by harness and model

`GET /datasets/session-cost`

Returns weekly refreshed, aggregated cost-per-session cells for the published harnesses.
Sessions are never pooled across apps. Medians are of per-session USD spend, and
privacy-preserving aggregation never exposes clerk_user_id values or per-session rows.

Filter by `app_slug`, `model`, or `turn_range`. Filtering by `model` alone works across apps
for harness-vs-harness comparison at a fixed model. Results refresh weekly and include the source snapshot
window in `meta`.

## Query parameters

- `app_slug` string — Filter to one published harness slug.
- `model` string — Exact model permaslug filter. Works across all harness apps.
- `turn_range` '1-turn' | '2-9-turns' | '10-49-turns' | '50-plus-turns' — Filter by the inclusive number of turns in a session.
- `limit` integer — Maximum number of cells to return (1-500). Defaults to 100.
- `offset` integer, nullable — Number of sorted cells to skip (0-5000). Defaults to 0.

## Response `200`

Aggregated cost-per-session cells for the requested filters.

- SessionCostResponse
  - `data` SessionCostItem[], required
    - `app_name` string, required — Published harness display label.
    - `app_slug` string, required — Stable public slug of the harness.
    - `median_session_cost_usd` number, double, required — Median USD spend per sampled session.
    - `model_permaslug` string, required — Exact model permaslug.
    - `turn_range` '1-turn' | '2-9-turns' | '10-49-turns' | '50-plus-turns', required — Inclusive session turn-count range.
  - `meta` SessionCostMeta, required
    - `as_of` string, required — ISO-8601 timestamp when the response was generated.
    - `version` 'v1', required — Dataset version.
    - `window_days` integer, nullable, required — Number of days in the weekly session sample window, or null when no snapshot is published.
    - `window_end_date` string, nullable, required — UTC date of the final day in the session sample window, or null when no snapshot is published.

## Other responses

- `400` — Bad Request - Invalid request parameters or malformed input
- `401` — Unauthorized - Authentication required or invalid credentials
- `429` — Too Many Requests - Rate limit exceeded
- `500` — Internal Server Error - Unexpected server error

---

[API](https://skmtc.net/openrouterteam/apis/openrouter-api.md) · [All operations](https://skmtc.net/openrouterteam/apis/openrouter-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/openrouterteam/openrouter-api/revisions/a7580d324ad2/schema)
