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

# Get Combined Results Report

> Aggregate two or more test results into a single report with success rate, metric summary, critical categories, latency and failure reasons



## OpenAPI

````yaml get /test_framework/v2/results/reports/
openapi: 3.1.0
info:
  title: Cekura API
  version: v1
  description: >-
    Complete API documentation for the Cekura platform. This API provides
    endpoints for testing, observing, and evaluating AI voice agents — including
    managing agents, running evaluators, defining metrics, and analyzing call
    quality.
servers:
  - url: https://api.cekura.ai
security: []
paths:
  /test_framework/v2/results/reports/:
    get:
      tags:
        - Results
      summary: Get a combined report across results
      description: >-
        Aggregate two or more test results into a single report: overall success
        rate, per-metric summary, run counts, critical categories, per-tag
        success rates, response-latency percentiles, deduplicated failure
        reasons and combined cost/duration figures.


        Find the result IDs with `results_list` first. Passing a single ID is
        allowed but `results_retrieve` is the better tool for one result.


        Leave `ql` at its default `{-runs}`. Selecting runs embeds every run of
        every result in the response; fetch the runs you actually need with
        `runs_bulk_retrieve` instead.
      operationId: results-reports-retrieve_3
      parameters:
        - in: query
          name: result_ids
          schema:
            type: string
          description: >-
            Results to combine — comma-separated string (e.g. '5591,5592'), not
            a JSON array.
          required: true
        - in: query
          name: run_filters
          schema:
            type: string
          description: >

            Optional JSON-encoded filter object restricting which runs the
            report counts. Every aggregate in the response is computed over the
            matching runs only. Invalid JSON returns 400.


            `join` is `and` (every filter must match) or `or` (any filter may
            match). Each item in `filters` has an `id` (the run field), an
            `operator` and a `value`.


            Supported filters:

            - `success` — `equals` with `true` or `false`

            - `status` — `equals` with one run status, e.g. `"completed"`

            - `id` — `equals` or `in` with run IDs

            - `scenarios` — `in` with scenario IDs

            - `tags` — `in` with scenario tags; a run matches if its scenario
            carries any of them

            - `scenario_name`, `call_ended_reason` — `in` with a list of values

            - `metrics` — no top-level `operator`; `value` is a list of metric
            conditions, each with the metric `id` and an `operator`: `equals`
            (with `value`), `greaterThanOrEqual` / `lessThanOrEqual` (with
            `value`), `range` (with `min` and `max`), or `exists` / `notExists`


            Example — failed runs from two scenarios whose metric 101 scored at
            least 3:

            ```json

            {
              "join": "and",
              "filters": [
                {"id": "success", "operator": "equals", "value": false},
                {"id": "scenarios", "operator": "in", "value": [3120, 3121]},
                {"id": "metrics", "value": [{"id": 101, "operator": "greaterThanOrEqual", "value": 3}]}
              ]
            }

            ```
        - in: query
          name: ql
          schema:
            type: string
            default: '{-runs}'
          description: >-
            Field selection. `{-runs}` (the default) returns the aggregates
            only; `{*}` additionally embeds every run and can be very large.
        - name: agent_id
          in: query
          required: false
          schema:
            type: integer
          description: >-
            Tenant scope. Supply one of `agent_id`, `assistant_id`, `project_id`
            when authenticating with a user session or OAuth bearer token; omit
            when using an API key already scoped to the tenant.
        - name: assistant_id
          in: query
          required: false
          schema:
            type: string
          description: >-
            Tenant scope. Supply one of `agent_id`, `assistant_id`, `project_id`
            when authenticating with a user session or OAuth bearer token; omit
            when using an API key already scoped to the tenant.
        - name: project_id
          in: query
          required: false
          schema:
            type: integer
          description: >-
            Tenant scope. Supply one of `agent_id`, `assistant_id`, `project_id`
            when authenticating with a user session or OAuth bearer token; omit
            when using an API key already scoped to the tenant.
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SchemaCombinedResultsReport'
          description: ''
        '400':
          content:
            application/json:
              schema:
                type: object
                properties:
                  field_name:
                    type: array
                    items:
                      type: string
          description: ''
      security:
        - api_key: []
        - oauth2: []
        - embedded_session: []
        - shareable_link: []
        - supabase_session: []
components:
  schemas:
    SchemaCombinedResultsReport:
      type: object
      properties:
        status:
          type: string
          description: Always 'completed' — the report is computed on read, not queued.
        success_rate:
          type: number
          format: double
          description: Percentage of runs that passed, across every result in the report
        total_runs_count:
          type: integer
          description: Runs in the report, including those still executing
        completed_runs_count:
          type: integer
          description: >-
            Runs that reached a terminal state (completed, failed, timeout or
            cancelled)
        success_runs_count:
          type: integer
          description: Completed runs that passed
        failed_runs_count:
          type: integer
          description: Completed runs that failed
        agent:
          type: integer
          description: ID of the agent the results belong to
        agent_version:
          oneOf:
            - {}
            - type: 'null'
          description: >

            Agent version every result ran against, or `null` when the results
            did not all run against the same version.


            Example:

            ```json

            {
              "history_id": 812,
              "version_id": "v3",
              "version_name": "Pricing prompt fix",
              "is_current": true
            }

            ```
        overall_evaluation:
          description: >

            Aggregate evaluation across all runs in the report.


            - `success_rate` — percentage of runs that passed

            - `metric_summary` — keyed by metric ID. Every entry has `id`,
            `name`, `type`, `score`, `errors` (the scenarios whose runs failed
            the metric, with the failing run IDs) and `overall_explanation`.
            Enum metrics add `enums` (per enum value: `score` as a percentage,
            `count` and `runs`), numeric metrics add percentiles such as `p50`,
            and critical metrics add `categories` keyed by category ID

            - `worst_performing_metrics` — `binary_adherence` lists the IDs of
            binary metrics that did not pass on every run, lowest pass rate
            first

            - `numeric_metrics` — numeric metric averages with their
            percentiles, plus average ringing duration when available

            - `enum_metrics` — the metric ID of every enum evaluation, one entry
            per evaluated run

            - `extra_metrics` — derived figures such as average ringing duration
            and expected-outcome score


            Example:

            ```json

            {
              "success_rate": 66.67,
              "metric_summary": {
                "101": {
                  "id": 101,
                  "name": "Politeness",
                  "type": "binary",
                  "vocera_defined_metric_code": "",
                  "score": 0.67,
                  "overall_explanation": [],
                  "errors": [
                    {
                      "id": 3120,
                      "name": "Asks for pricing",
                      "agent": 42,
                      "personality": 7,
                      "personality_name": "Busy professional",
                      "retell_agent_id": "",
                      "instructions": "",
                      "is_simulating": false,
                      "runs": [90012]
                    }
                  ]
                },
                "102": {
                  "id": 102,
                  "name": "Sentiment",
                  "type": "enum",
                  "vocera_defined_metric_code": "",
                  "score": null,
                  "overall_explanation": [],
                  "errors": [],
                  "enums": {
                    "positive": {"score": 100.0, "count": 3, "runs": [{"id": 90011}, {"id": 90012}, {"id": 90013}]}
                  }
                },
                "103": {
                  "id": 103,
                  "name": "Latency",
                  "type": "numeric",
                  "vocera_defined_metric_code": "",
                  "score": 850.0,
                  "p50": 800.0,
                  "overall_explanation": [],
                  "errors": []
                },
                "104": {
                  "id": 104,
                  "name": "Critical Deviations",
                  "type": "binary",
                  "vocera_defined_metric_code": "",
                  "score": 0.67,
                  "overall_explanation": [],
                  "errors": [],
                  "categories": {
                    "55": {
                      "id": 55,
                      "category": "Wrong price quoted",
                      "runs": [{"id": 90012}],
                      "runs_count": 1,
                      "priority_counts": {"critical": 1, "non-critical": 0, "not_a_bug": 0},
                      "scenarios": {}
                    }
                  }
                }
              },
              "worst_performing_metrics": {"binary_adherence": [101, 104]},
              "numeric_metrics": [
                {"name": "Latency", "type": "numeric", "value": 850.0, "percentiles": {"p50": 800.0}},
                {"name": "Average Ringing Duration", "type": "numeric", "value": 2.5, "percentiles": {"p50": 2.5}}
              ],
              "enum_metrics": [102, 102, 102],
              "extra_metrics": [
                {"name": "Average Ringing Duration", "type": "numeric", "value": 2.5, "percentiles": {"p50": 2.5}},
                {"name": "Expected Outcome", "type": "numeric", "value": 3.33}
              ]
            }

            ```
        metrics:
          description: |

            Metrics configured on the agent.

            Example:
            ```json
            [
              {
                "id": 101,
                "name": "Politeness",
                "eval_type": "binary",
                "simulation_enabled": true,
                "observability_enabled": true,
                "function_name": null,
                "vocera_defined_metric_code": ""
              }
            ]
            ```
        critical_categories:
          description: >

            Critical-issue categories found across the runs, most critical
            first. Categories marked as not a bug and evaluations marked as
            wrong are excluded.


            Example:

            ```json

            [
              {
                "id": 55,
                "category": "Wrong price quoted",
                "scenarios": {},
                "runs_count": 1,
                "runs": [{"id": 90012}],
                "priority_counts": {"critical": 1, "non-critical": 0, "not_a_bug": 0}
              }
            ]

            ```
        runs_by_tags:
          description: >

            Keyed by scenario tag: the IDs of the runs whose scenario carries
            the tag and the success rate (percentage) of those runs.


            Example:

            ```json

            {
              "billing": {"runs": [90013, 90012, 90011], "success_rate": 66.67}
            }

            ```
        latency_data:
          description: >

            Response latency in milliseconds across all measured turns of all
            runs.


            Example:

            ```json

            {"mean": 800.0, "median": 800.0, "p50": 800.0, "p95": 890.0, "p99":
            898.0}

            ```
        failed_reasons:
          description: >

            Failure issues merged and deduplicated across the results, ranked by
            how many runs they affect.


            Example:

            ```json

            {
              "issues": [
                {
                  "rank": 1,
                  "title": "Missed pricing",
                  "description": "The agent never shared pricing when asked.",
                  "run_ids": [90012],
                  "affected_count": 1
                }
              ],
              "total_failed_runs": 1
            }

            ```
        performance_metrics:
          description: >

            Per-metric performance across the runs, rubric metrics first.
            `aggregate_unit` is `percent`, `value`, `score` or an empty string.
            `passed` and `threshold_text` come from the project rubric; `passed`
            is `null` and `in_rubric` is `false` for metrics without a rubric
            rule. Enum metrics add `enum_run_ids` (run IDs per enum value),
            rating metrics add `score_range_run_ids` and expected-outcome
            metrics add `review_required_run_ids`.


            Example:

            ```json

            [
              {
                "metric_id": 101,
                "metric_name": "Politeness",
                "eval_type": "binary",
                "aggregate_value": 66.7,
                "aggregate_unit": "percent",
                "passed": false,
                "threshold_text": ">= 80%",
                "evaluated_runs_count": 3,
                "evaluated_run_ids": [90013, 90012, 90011],
                "failing_run_ids": [90012],
                "passing_run_ids": [90013, 90011],
                "in_rubric": true
              },
              {
                "metric_id": 105,
                "metric_name": "Clarity",
                "eval_type": "continuous_qualitative",
                "aggregate_value": 4.0,
                "aggregate_unit": "score",
                "passed": null,
                "threshold_text": "",
                "evaluated_runs_count": 3,
                "evaluated_run_ids": [90013, 90012, 90011],
                "failing_run_ids": [],
                "passing_run_ids": [],
                "in_rubric": false,
                "score_range_run_ids": {"0-50": [], "50-75": [], ">75": [90013, 90012, 90011]}
              }
            ]

            ```
        runs:
          description: >

            Every run in the report, keyed by run ID. Present only when `ql`
            selects it (e.g. `{*}`); the default `{-runs}` omits it.


            Example:

            ```json

            {
              "90012": {
                "id": 90012,
                "result_id": 5591,
                "result_name": "Nightly regression",
                "scenario": 3120,
                "scenario_name": "Asks for pricing",
                "personality_name": "Busy professional",
                "test_profile_name": null,
                "expected_outcome": {"score": 0},
                "success": false,
                "status": "completed",
                "evaluation_status": "failure",
                "evaluation": {
                  "metrics": [
                    {
                      "id": 101,
                      "name": "Politeness",
                      "type": "binary",
                      "score": false,
                      "score_normalized": 0,
                      "explanation": ["The agent interrupted the caller twice."],
                      "extra": {},
                      "vocera_defined_metric_code": "",
                      "function_name": null,
                      "thumbs_up": null
                    },
                    {
                      "id": 102,
                      "name": "Sentiment",
                      "type": "enum",
                      "enum": "positive",
                      "explanation": [],
                      "extra": {},
                      "vocera_defined_metric_code": "",
                      "function_name": null,
                      "thumbs_up": null
                    }
                  ]
                },
                "timestamp": "2026-09-24T08:43:10.473761Z",
                "executed_at": "2026-09-24T08:43:12.000000Z",
                "duration": "01:00",
                "error_message": "",
                "metadata": {"ringing_duration": 2.5},
                "inbound_number": "",
                "outbound_dial_window_opens_at": null,
                "outbound_dial_window_seconds": null,
                "outbound_dial_window_closes_at": null
              }
            }

            ```
      required:
        - agent
        - agent_version
        - completed_runs_count
        - critical_categories
        - failed_reasons
        - failed_runs_count
        - latency_data
        - metrics
        - overall_evaluation
        - performance_metrics
        - runs_by_tags
        - status
        - success_rate
        - success_runs_count
        - total_runs_count
  securitySchemes:
    api_key:
      type: apiKey
      in: header
      name: X-CEKURA-API-KEY
      description: >-
        API Key Authentication. It should be included in the header of each
        request.
    oauth2:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: OAuth access token issued by Cekura for connected apps.
    embedded_session:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Embedded-dashboard session token. Internal.
    shareable_link:
      type: apiKey
      in: header
      name: X-VOCERA-SHAREABLE-LINK-TOKEN
      description: Share-link token scoped to a single shared resource.
    supabase_session:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Cekura dashboard session token. Not a customer API credential.

````