---
title: "List Eval History"
method: GET
path: "/v1/api-performance/custom-evals/history"
tags: ["Eval Results"]
---

# List Eval History

`GET /v1/api-performance/custom-evals/history`

## Request

- Base URL: `https://api.lightsage.com`
- URL: `https://api.lightsage.com/v1/api-performance/custom-evals/history`
- Auth: API key in header `X-Lightsage-Api-Key`

Returns eval result history with limit-and-offset pagination, filtering, and sorting. Runs that ended because of infrastructure failures are excluded.

## Query parameters

- `custom_eval_id` string
- `limit` integer
- `offset` integer
- `search` string
- `result_filter` 'all' | 'passed' | 'failed'
- `target_key` string
- `category_id` string
- `sort_by` 'time' | 'use_case' | 'target' | 'result' | 'score' | 'tool_calls' | 'latency'
- `sort_dir` 'asc' | 'desc'

## Response `200`

Successful Response

- PublicCustomEvalHistoryResponse
  - `runs` PublicCustomEvalHistoryRun[], required
    - `id` string, required: Result ID, not an eval job ID.
    - `endpoint` PublicCustomEvalHistoryEndpoint, required
      - `id` string, required: The eval's ID.
      - `prompt` string, nullable: Stored prompt, before the instructions appended in `prompt_sent`.
      - `description` string, nullable: What counts as success.
      - `category` PublicCustomEvalHistoryCategory
        - `id` string, required
        - `name` string, required
        - `slug` string, required
        - `sort_order` integer
    - `target_key` string, nullable: `text:{model_id}` or `agent:{agent_id}:{model_id}`.
    - `eval_type` string, nullable
    - `prompt_sent` string, nullable: The eval prompt plus the instructions Lightsage appends.
    - `model_id` string, nullable: Public model ID, such as `openai/gpt-5.4` or `anthropic/claude-sonnet-5`.
    - `model_type` string, nullable: `agent` or `text`.
    - `agent_id` string, nullable: Coding-agent harness, such as `pi`, `kilo`, `codex`, or `claude-code`; null for text-model runs.
    - `passed` boolean, required
    - `score` number, nullable: 0 to 1.
    - `latency_ms` integer, nullable: Whole agent run, not a single API call.
    - `tool_call_count` integer, required: Tool invocations the agent made, counting a call and its result once. Matches the length of `tool_calls` on the retrieved result.
    - `error_message` string, nullable
    - `is_infra_error` boolean: Always `false` here; such rows are withheld.
    - `run_at` string, required
    - `harness_label` string, nullable
    - `model_label` string, nullable
    - `run_context_sent` object: Skills, environment profile, starter project, docs inclusion, and `run_source` (`manual`, `scheduled`, `public_api`, or `github_pr_bot`).
  - `total` integer, required: Ignores `limit` and `offset`.
  - `limit` integer, required
  - `offset` integer, required
  - `hide_infra_errors` boolean: Always `true` on the public API.
  - `facets` PublicCustomEvalHistoryFacets
    - `targets` PublicCustomEvalHistoryFilterOption[]: `value` is a `target_key`.
      - `value` string, required
      - `label` string, required
      - `count` integer, required: Not narrowed by `search`, `result_filter`, `target_key`, or `category_id`.
    - `categories` PublicCustomEvalHistoryFilterOption[]: `value` is a `category_id`.
      - `value` string, required
      - `label` string, required
      - `count` integer, required: Not narrowed by `search`, `result_filter`, `target_key`, or `category_id`.

## Other responses

- `404`: The organization does not have a configured API Performance scope.
- `422`: Validation Error

---

[API](https://skmtc.dev/usesapient/apis/sapient-public-api.md) - [All operations](https://skmtc.dev/usesapient/apis/sapient-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/usesapient/apis/sapient-public-api/revisions/14890dfe867e?raw)
