> This page is for API Reference & Tools.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.moveworks.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.moveworks.com/_mcp/server.

# Get the JSON report, with the execution trace

GET https://api.moveworks.ai/rest/v1alpha1/eval_runs/{eval_run_id}/report

Available once `lifecycle.report.status` is `REPORT_STATUS_AVAILABLE`, which can precede cleanup. One entry
per accepted task with
its conversation, the per-turn trajectory (tool calls with arguments, outputs, status and timing; the tools the
agent could see; token usage), and the result of every grader by name. Failed tasks are included with an `error`
and no scores.

Responses are large for big batches; send `Accept-Encoding: gzip`. Visible to the user who created the run
and to the eval admins Moveworks designates for the org; any other id answers `404 RESOURCE_NOT_FOUND`.


Reference: https://docs.moveworks.com/api-reference/alpha-eval-api/eval-runs/get-eval-run-report

## Authentication

- `Authorization` header (bearer token, required) — OAuth 2.0 client-credentials bearer from `POST /oauth/v1/token` (same as the Conversations API). The token is issued to one org and bound to one user; the run executes in that org and its conversations run as that user. If the eval config names a `source_org`, it must be the same org. An org that is not enabled for the Eval API sees `404 NOT_FOUND` ("API not found") on every route. An enabled org whose credential is not entitled to run evals receives `403 REQUEST_ACCESS_DENIED`. `submitted_by.email_addr` is the email of the user the credential is bound to.

## Request

### Path parameters

- `eval_run_id` (string, required) — The run id returned by the submit call.

## Response

### 200

The report.

- `eval_run_id` (string, required)
- `title` (string, required)
- `generated_at` (datetime, required)
- `summary` (EvalReportSummary, required)
- `tasks` (list of TaskResult, optional) — One entry per accepted task, in task-file order. Includes failed tasks.

## Errors

### 400 Bad Request Error

`INVALID_REQUEST`: a malformed `eval_run_id`. `BAD_REQUEST`: a reserved field or a wrong parameter type.

- `error` (ErrorError, required)

### 401 Unauthorized Error

Missing or invalid credentials.

- `error` (ErrorError, required)

### 403 Forbidden Error

The config names a `source_org` other than the token's org, the caller is not entitled, or the token's user is not provisioned for the Conversations API in the org (or the org has no Conversations API bot); in the last case the message names the org and user and says to ask a Moveworks admin.

- `error` (ErrorError, required)

### 404 Not Found Error

No run with this id is visible to the caller (`RESOURCE_NOT_FOUND`); a run is visible to the user who created it and to the eval admins Moveworks designates for the org, never across orgs. An org without the Eval API enabled, any unknown path and any method a path does not serve answer `NOT_FOUND` with the message `API not found`.

- `error` (ErrorError, required)

### 409 Conflict Error

Not ready, or never coming: `INVALID_REQUEST` with the run's status (and phase) in `message`. Poll `report.status` while the run is `QUEUED` or `RUNNING`; a `FAILED` or `CANCELED` run produces no report.

- `error` (ErrorError, required)

### 429 Too Many Requests Error

Per-org rate limit. The body is `{"error":"Rate limit exceeded"}`, a string rather than the envelope; no `Retry-After` header is sent.

- `error` (string, optional)

### 500 Internal Server Error

Unexpected failure.

- `error` (ErrorError, required)

## Types

### EvalReportSummary

- `tasks` (EvalReportSummaryTasks, optional)
- `metrics` (list of SummaryMetric, optional)
- `usage` (Usage, optional) — Summed over all turns of all tasks.

### TaskResult

One task = one simulated conversation.

- `task_id` (string, required) — The task's `goal_id`.
- `file` (string, required) — Task file the task came from.
- `status` (enum, required) — `TASK_STATUS_FAILED` = no conversation or no scores; see `error`. Failed tasks are excluded from summary means. Later versions may add values.
  - Allowed values: `TASK_STATUS_COMPLETED`, `TASK_STATUS_FAILED`
- `index` (integer, optional) — 0-based position of the task in that file.
- `error` (TaskError, optional) — Why one task produced no scores. The rest of the report is unaffected.
- `conversation` (Conversation, optional)
- `graders` (list of GraderResult, optional)
- `metrics` (TaskResultMetrics, optional) — Absent for a `FAILED` task. A count or latency that is 0 is omitted; read it as 0.

### ErrorError

- `code` (enum, required) — | code | HTTP | meaning | | ------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `INVALID_REQUEST` | 400, 409 | 400: a required field is empty (`eval_config.content`, `task_files[i].file_id`), a `limit` outside 1 to 100, or a malformed `cursor` or `eval_run_id`; raised by the service. 409: the run's state forbids the call (report not ready, run ended without a report, cancel of a COMPLETED or FAILED run); the message names the state. | | `VALIDATION_FAILED` | 400 | Submission rejected, nothing started; `message` opens with the rejected-of-submitted task file counts (files, not tasks), then lists the issues (file, task index, code, path, line), at most 20 lines then `+N more`; a `validate_only` dry run answers the same error. | | `FIELD_TOO_LARGE` | 400 | The task files referenced by id exceed 256 MiB together. | | `REQUEST_ACCESS_DENIED` | 403 | Config names a `source_org` other than the token's org, the caller is not entitled, or the token's user is not provisioned for the Conversations API in the org (or the org has no Conversations API bot). | | `RESOURCE_NOT_FOUND` | 404 | No run with this id is visible to the caller: a run is visible to the user who created it and to the eval admins Moveworks designates for the org. Used instead of 403 so run ids do not leak across users or orgs. | | `RESOURCE_ALREADY_EXISTS` | 409 | Not expected: extra runs wait as `EVAL_RUN_STATUS_QUEUED` (see `lifecycle.queue_reason`). Listed for completeness. | | `BAD_REQUEST` | 400 | The body is not valid JSON, a field has the wrong type, a reserved field is set, or a cancel body exceeds 64 KiB; raised by the gateway before the request reaches the service. | | `UNAUTHORIZED` | 401 | Missing or invalid bearer token. | | `NOT_FOUND` | 404 | Unknown path or method, or the Eval API feature is off for the org ("API not found"). | | `INTERNAL_SERVER_ERROR` | 500 | Unexpected failure. | A rate-limited request (429) carries the string body `{"error":"Rate limit exceeded"}`, not this envelope.
  - Allowed values: `INVALID_REQUEST`, `VALIDATION_FAILED`, `FIELD_TOO_LARGE`, `REQUEST_ACCESS_DENIED`, `RESOURCE_NOT_FOUND`, `RESOURCE_ALREADY_EXISTS`, `BAD_REQUEST`, `UNAUTHORIZED`, `NOT_FOUND`, `INTERNAL_SERVER_ERROR`
- `message` (string, required) — Human-readable, customer-safe. Not stable; branch on `code`.

### EvalReportSummaryTasks

- `total` (integer, required)
- `completed` (integer, required)
- `failed` (integer, required)

### SummaryMetric

- `name` (string, required)
- `kind` (enum, required) — What the metric aggregates: one judge category, the deterministic graders, the tool-sequence graders, latency, or turn counts. Later versions may add values.
  - Allowed values: `METRIC_KIND_JUDGE_CATEGORY`, `METRIC_KIND_DETERMINISTIC`, `METRIC_KIND_TOOL_SEQUENCE`, `METRIC_KIND_LATENCY`, `METRIC_KIND_TURNS`
- `value` (double, required) — Mean over the tasks in `sample_count`. Ratios are in [0, 1].
- `sample_count` (integer, required) — Tasks that contributed. Always state it next to `value`.

### Usage

Token totals summed over model calls; a field that is 0 is omitted, read it as 0. `total_tokens` is input + output; `cached_tokens` and `reasoning_tokens` are subsets and do not add to the total.

- `input_tokens` (integer, optional)
- `output_tokens` (integer, optional)
- `total_tokens` (integer, optional)
- `cached_tokens` (integer, optional)
- `reasoning_tokens` (integer, optional)

### TaskError

Why one task produced no scores. The rest of the report is unaffected.

- `code` (enum, required) — `TASK_ERROR_CODE_TURN_TIMEOUT` — the assistant did not complete a turn within the per-turn limit; `TASK_ERROR_CODE_SETUP_FAILED` — seeding the task's simulated instance failed; `TASK_ERROR_CODE_SIMULATION_FAILED` — the conversation aborted; `TASK_ERROR_CODE_TEARDOWN_FAILED` — the task's instance could not be released (scores may still be present); `TASK_ERROR_CODE_INTERNAL_ERROR` — anything else. Later versions may add values.
  - Allowed values: `TASK_ERROR_CODE_TURN_TIMEOUT`, `TASK_ERROR_CODE_SETUP_FAILED`, `TASK_ERROR_CODE_SIMULATION_FAILED`, `TASK_ERROR_CODE_TEARDOWN_FAILED`, `TASK_ERROR_CODE_INTERNAL_ERROR`
- `phase` (enum, required) — Which step of the task failed. Later versions may add values.
  - Allowed values: `TASK_ERROR_PHASE_SETUP`, `TASK_ERROR_PHASE_SIMULATION`, `TASK_ERROR_PHASE_TEARDOWN`
- `attempts` (integer, required) — Attempts made before giving up (3 today).
- `message` (string, required) — Customer-safe.

### Conversation

- `conversation_id` (string, required)
- `turns` (list of Turn, optional)

### GraderResult

One grader from the task file, by name. Exactly one of `judge`, `deterministic`, `tool_sequence` is present when the grader ran, matching `type`; a `GRADER_STATUS_ERROR` grader may carry none.

- `name` (string, required) — Grader `name` from the task file (unique within the task).
- `type` (enum, required) — Matches the grader `type` in the task file: `GRADER_TYPE_LLM_JUDGE` for `llm_as_judge`, `GRADER_TYPE_DETERMINISTIC` for `deterministic`, `GRADER_TYPE_TOOL_SEQUENCE` for `tool_sequence`. Later versions may add values.
  - Allowed values: `GRADER_TYPE_LLM_JUDGE`, `GRADER_TYPE_DETERMINISTIC`, `GRADER_TYPE_TOOL_SEQUENCE`
- `status` (enum, required) — `GRADER_STATUS_ERROR` = the grader itself could not run (task failed, judge unavailable, query error). Later versions may add values.
  - Allowed values: `GRADER_STATUS_PASSED`, `GRADER_STATUS_FAILED`, `GRADER_STATUS_ERROR`
- `score` (double, optional) — Fraction of the grader's assertions satisfied; 1.0 or 0.0 for single-assertion graders.
- `judge` (GraderResultJudge, optional)
- `deterministic` (GraderResultDeterministic, optional)
- `tool_sequence` (GraderResultToolSequence, optional)

### TaskResultMetrics

Absent for a `FAILED` task. A count or latency that is 0 is omitted; read it as 0.

- `latency_seconds` (double, optional)
- `user_turns` (integer, optional)
- `total_turns` (integer, optional)
- `usage` (Usage, optional) — Token totals summed over model calls; a field that is 0 is omitted, read it as 0. `total_tokens` is input + output; `cached_tokens` and `reasoning_tokens` are subsets and do not add to the total.

### Turn

- `index` (integer, required) — 0-based.
- `user` (TurnUser, required)
- `assistant` (TurnAssistant, required)
- `trajectory` (Trajectory, optional)

### GraderResultJudge

- `assertions` (list of GraderResultJudgeAssertionsItems, optional)

### GraderResultDeterministic

- `query` (string, optional) — Not emitted in v1alpha1.
- `expected` (any, optional)
- `actual` (any, optional)
- `comparison_type` (string, optional)

### GraderResultToolSequence

- `expected` (list of string, optional)
- `observed` (list of string, optional) — Tool names in call order, counted as the eval framework counts them (one entry per call; a call that never left the pending state is dropped). Empty when the sample carries no complete trajectory record; score and status then still come from the report's own tool-sequence metric. Every TOOL_SEQUENCE grader of a task shows the sample's single value.

### TurnUser

- `content` (string, required) — What the simulated employee said.
- `created_at` (datetime, optional)

### TurnAssistant

- `status` (enum, required) — `ASSISTANT_TURN_STATUS_FAILED` = the assistant did not complete the turn; see `error`. Later versions may add values.
  - Allowed values: `ASSISTANT_TURN_STATUS_COMPLETED`, `ASSISTANT_TURN_STATUS_FAILED`
- `response_id` (string, optional) — Conversations API response id; usable with Moveworks support and the Data API. Absent when the harness stored no record for the turn.
- `messages` (list of TurnAssistantMessagesItems, optional)
- `error` (TurnAssistantError, optional)
- `created_at` (datetime, optional)
- `completed_at` (datetime, optional)

### Trajectory

- `tool_calls` (list of ToolCall, optional)
- `available_tools` (TrajectoryAvailableTools, optional) — The tools offered to the model when it chose what to call in this turn. Excludes tools the platform holds back (deferred tools that only appear after a tool search), so this is the real candidate set, typically dozens, not the org's whole catalog.
- `usage` (Usage, optional) — Token totals summed over model calls; a field that is 0 is omitted, read it as 0. `total_tokens` is input + output; `cached_tokens` and `reasoning_tokens` are subsets and do not add to the total.

### GraderResultJudgeAssertionsItems

- `text` (string, required)
- `category` (string, optional) — The `Category:` prefix, when the suite uses them.
- `passed` (boolean, optional) — Absent when the judge left the label null or no observed behavior matched the assertion.
- `reasoning` (string, optional) — Not emitted in v1alpha1.

### TurnAssistantMessagesItems

- `content` (string, optional)
- `created_at` (datetime, optional)

### TurnAssistantError

- `code` (string, optional)
- `message` (string, optional)

### ToolCall

One tool invocation as the agent saw it. Same shape and semantics as the Conversations API trajectory.

- `call_id` (string, required)
- `tool` (ToolIdentity, required)
- `status` (enum, required) — `TOOL_CALL_STATUS_IN_PROGRESS` = decided, waiting on the user; `TOOL_CALL_STATUS_COMPLETED` = executed (see `error` for a failed execution); `TOOL_CALL_STATUS_INCOMPLETE` = never dispatched (see `status_reason`). Later versions may add values.
  - Allowed values: `TOOL_CALL_STATUS_IN_PROGRESS`, `TOOL_CALL_STATUS_COMPLETED`, `TOOL_CALL_STATUS_INCOMPLETE`
- `connectors` (list of ConnectorRef, optional) — One entry per `connector_map` entry this call touched, each with its own `mode`; a tool call is a plugin and a plugin may span several connectors. Empty when the call could not be attributed to a `connector_map` entry (legacy runs, an unreadable port artifact, REST calls whose plugin name differs from the ported action name).
- `arguments` (ToolCallArguments, optional) — As passed to the tool. May be truncated; see `arguments_truncation`.
- `output` (ToolCallOutput, optional) — As returned by the tool. Present when `status` is `TOOL_CALL_STATUS_COMPLETED`.
- `status_reason` (enum, optional) — Why a tool call is `TOOL_CALL_STATUS_INCOMPLETE`. Later versions may add values.
  - Allowed values: `TOOL_CALL_STATUS_REASON_PENDING_USER_CONSENT`, `TOOL_CALL_STATUS_REASON_PENDING_USER_CONFIRMATION`, `TOOL_CALL_STATUS_REASON_PENDING_USER_INPUT`, `TOOL_CALL_STATUS_REASON_INVALID_ARGUMENTS`, `TOOL_CALL_STATUS_REASON_POLICY`
- `error` (ToolCallError, optional) — Set when the tool executed and failed.
- `requested_at` (datetime, optional)
- `dispatched_at` (datetime, optional)
- `completed_at` (datetime, optional)
- `arguments_truncation` (Truncation, optional) — Present only when the payload was cut, so `truncated` is always true when the object is present; an uncut payload has no marker.
- `output_truncation` (Truncation, optional) — Present only when the payload was cut, so `truncated` is always true when the object is present; an uncut payload has no marker.

### TrajectoryAvailableTools

The tools offered to the model when it chose what to call in this turn. Excludes tools the platform holds back (deferred tools that only appear after a tool search), so this is the real candidate set, typically dozens, not the org's whole catalog.

- `recorded` (boolean, required) — False when the tool list was not captured for this turn; do not read an empty `tools` as "no tools".
- `tools` (list of ToolIdentity, optional)

### ToolIdentity

- `name` (string, required)
- `namespace` (string, optional) — Plugin or MCP server the tool belongs to.
- `id` (string, optional)

### ConnectorRef

One `connector_map` entry a tool call went through, and where the call went.

- `name` (string, optional) — The `connector_map` row that declared the connector when exactly one row maps to it, else the connector's name in the run's configuration copy.
- `mode` (enum, optional) — Whether the call hit the simulated environment (`CONNECTOR_MODE_MOCKED`) or the real system (`CONNECTOR_MODE_AS_IS`). A call that could not be attributed to any `connector_map` entry has an empty `connectors` list. Later versions may add values.
  - Allowed values: `CONNECTOR_MODE_MOCKED`, `CONNECTOR_MODE_AS_IS`

### ToolCallArguments

As passed to the tool. May be truncated; see `arguments_truncation`.

### ToolCallOutput

As returned by the tool. Present when `status` is `TOOL_CALL_STATUS_COMPLETED`.

### ToolCallError

Set when the tool executed and failed.

- `code` (string, optional)
- `message` (string, optional)

### Truncation

Present only when the payload was cut, so `truncated` is always true when the object is present; an uncut payload has no marker.

- `truncated` (boolean, required)
- `original_bytes` (integer, optional) — Size of the full payload before the cut. Absent when it was not recorded; never emitted as 0.

## Examples

**Response**

```json
{
  "eval_run_id": "b3d1a9e2-6f7c-4d2e-9a1b-2c3d4e5f6a7b",
  "title": "Calendar Eval",
  "generated_at": "2026-10-01T20:03:10Z",
  "summary": {
    "tasks": {
      "total": 40,
      "completed": 39,
      "failed": 1
    },
    "metrics": [
      {
        "name": "Entity Resolution",
        "kind": "METRIC_KIND_JUDGE_CATEGORY",
        "value": 0.87,
        "sample_count": 39
      },
      {
        "name": "database_state_assertions",
        "kind": "METRIC_KIND_DETERMINISTIC",
        "value": 0.92,
        "sample_count": 39
      },
      {
        "name": "end_to_end_latency_seconds",
        "kind": "METRIC_KIND_LATENCY",
        "value": 14.2,
        "sample_count": 39
      },
      {
        "name": "expected_tool_call_present",
        "kind": "METRIC_KIND_TOOL_SEQUENCE",
        "value": 0.95,
        "sample_count": 39
      },
      {
        "name": "user_turns",
        "kind": "METRIC_KIND_TURNS",
        "value": 1.4,
        "sample_count": 39
      }
    ],
    "usage": {
      "input_tokens": 1834211,
      "output_tokens": 96410,
      "total_tokens": 1930621
    }
  },
  "tasks": [
    {
      "task_id": "cal_create_001",
      "file": "calendar_suite.yaml",
      "status": "TASK_STATUS_COMPLETED",
      "index": 0,
      "conversation": {
        "conversation_id": "conv_01J...",
        "turns": [
          {
            "index": 0,
            "user": {
              "content": "Book a 30 min sync with Priya tomorrow at 10am",
              "created_at": "2026-10-01T18:01:02Z"
            },
            "assistant": {
              "status": "ASSISTANT_TURN_STATUS_COMPLETED",
              "response_id": "resp_01J...",
              "messages": [
                {
                  "content": "Done. I scheduled \"Sync\" with Priya Nair for Oct 2, 10:00–10:30 PT.",
                  "created_at": "2026-10-01T18:01:14Z"
                }
              ],
              "created_at": "2026-10-01T18:01:02Z",
              "completed_at": "2026-10-01T18:01:14Z"
            },
            "trajectory": {
              "tool_calls": [
                {
                  "call_id": "call_01",
                  "tool": {
                    "name": "search_people",
                    "namespace": "people"
                  },
                  "status": "TOOL_CALL_STATUS_COMPLETED",
                  "connectors": [
                    {
                      "name": "hr_directory",
                      "mode": "CONNECTOR_MODE_AS_IS"
                    }
                  ],
                  "arguments": {
                    "query": "Priya"
                  },
                  "output": {
                    "results": [
                      {
                        "email": "priya.nair@example.com"
                      }
                    ]
                  },
                  "requested_at": "2026-10-01T18:01:04Z",
                  "dispatched_at": "2026-10-01T18:01:04Z",
                  "completed_at": "2026-10-01T18:01:05Z",
                  "output_truncation": {
                    "truncated": true,
                    "original_bytes": 48213
                  }
                },
                {
                  "call_id": "call_02",
                  "tool": {
                    "name": "create_event",
                    "namespace": "calendar"
                  },
                  "status": "TOOL_CALL_STATUS_COMPLETED",
                  "connectors": [
                    {
                      "name": "events",
                      "mode": "CONNECTOR_MODE_MOCKED"
                    }
                  ],
                  "arguments": {
                    "attendees": [
                      "priya.nair@example.com"
                    ],
                    "end": "2026-10-02T10:30:00-07:00",
                    "start": "2026-10-02T10:00:00-07:00",
                    "subject": "Sync"
                  },
                  "output": {
                    "id": "evt_9c1"
                  },
                  "requested_at": "2026-10-01T18:01:08Z",
                  "dispatched_at": "2026-10-01T18:01:08Z",
                  "completed_at": "2026-10-01T18:01:09Z"
                }
              ],
              "available_tools": {
                "recorded": true,
                "tools": [
                  {
                    "name": "search_people",
                    "namespace": "people"
                  },
                  {
                    "name": "create_event",
                    "namespace": "calendar"
                  },
                  {
                    "name": "list_events",
                    "namespace": "calendar"
                  }
                ]
              },
              "usage": {
                "input_tokens": 41230,
                "output_tokens": 1830,
                "total_tokens": 43060,
                "cached_tokens": 12800
              }
            }
          }
        ]
      },
      "graders": [
        {
          "name": "event_created",
          "type": "GRADER_TYPE_DETERMINISTIC",
          "status": "GRADER_STATUS_PASSED",
          "score": 1,
          "deterministic": {
            "expected": 1,
            "actual": 1,
            "comparison_type": "equals"
          }
        },
        {
          "name": "resolution",
          "type": "GRADER_TYPE_LLM_JUDGE",
          "status": "GRADER_STATUS_FAILED",
          "score": 0.5,
          "judge": {
            "assertions": [
              {
                "text": "Resolves 'Priya' to exactly one employee without asking",
                "category": "Entity Resolution",
                "passed": true
              },
              {
                "text": "Confirms the resolved person's full name in the reply",
                "category": "Entity Resolution",
                "passed": false
              }
            ]
          }
        },
        {
          "name": "tool_order",
          "type": "GRADER_TYPE_TOOL_SEQUENCE",
          "status": "GRADER_STATUS_PASSED",
          "score": 1,
          "tool_sequence": {
            "expected": [
              "search_people",
              "create_event"
            ],
            "observed": [
              "search_people",
              "create_event"
            ]
          }
        }
      ],
      "metrics": {
        "latency_seconds": 12.1,
        "user_turns": 1,
        "total_turns": 2,
        "usage": {
          "input_tokens": 41230,
          "output_tokens": 1830,
          "total_tokens": 43060,
          "cached_tokens": 12800
        }
      }
    },
    {
      "task_id": "cal_reschedule_014",
      "file": "calendar_suite.yaml",
      "status": "TASK_STATUS_FAILED",
      "index": 13,
      "error": {
        "code": "TASK_ERROR_CODE_TURN_TIMEOUT",
        "phase": "TASK_ERROR_PHASE_SIMULATION",
        "attempts": 3,
        "message": "The assistant did not complete turn 2 within 180 s on any of 3 attempts."
      },
      "conversation": {
        "conversation_id": "conv_01K...",
        "turns": [
          {
            "index": 0,
            "user": {
              "content": "Move my 3pm with Diego to Friday"
            },
            "assistant": {
              "status": "ASSISTANT_TURN_STATUS_FAILED",
              "response_id": "resp_01K...",
              "error": {
                "code": "TIMEOUT",
                "message": "response not completed"
              }
            },
            "trajectory": {
              "tool_calls": [
                {
                  "call_id": "call_11",
                  "tool": {
                    "name": "list_events",
                    "namespace": "calendar"
                  },
                  "status": "TOOL_CALL_STATUS_INCOMPLETE",
                  "connectors": [
                    {
                      "name": "events",
                      "mode": "CONNECTOR_MODE_MOCKED"
                    }
                  ],
                  "arguments": {
                    "date": "today"
                  },
                  "status_reason": "TOOL_CALL_STATUS_REASON_PENDING_USER_INPUT"
                }
              ],
              "available_tools": {
                "recorded": true,
                "tools": [
                  {
                    "name": "list_events",
                    "namespace": "calendar"
                  },
                  {
                    "name": "update_event",
                    "namespace": "calendar"
                  }
                ]
              }
            }
          }
        ]
      },
      "graders": [
        {
          "name": "event_moved",
          "type": "GRADER_TYPE_DETERMINISTIC",
          "status": "GRADER_STATUS_ERROR"
        },
        {
          "name": "resolution",
          "type": "GRADER_TYPE_LLM_JUDGE",
          "status": "GRADER_STATUS_ERROR"
        }
      ]
    }
  ]
}
```

**SDK Code**

```python Eval runs_getEvalRunReport_example
import requests

url = "https://api.moveworks.ai/rest/v1alpha1/eval_runs/eval_run_id/report"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript Eval runs_getEvalRunReport_example
const url = 'https://api.moveworks.ai/rest/v1alpha1/eval_runs/eval_run_id/report';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Eval runs_getEvalRunReport_example
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.moveworks.ai/rest/v1alpha1/eval_runs/eval_run_id/report"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Eval runs_getEvalRunReport_example
require 'uri'
require 'net/http'

url = URI("https://api.moveworks.ai/rest/v1alpha1/eval_runs/eval_run_id/report")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java Eval runs_getEvalRunReport_example
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.moveworks.ai/rest/v1alpha1/eval_runs/eval_run_id/report")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Eval runs_getEvalRunReport_example
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.moveworks.ai/rest/v1alpha1/eval_runs/eval_run_id/report', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp Eval runs_getEvalRunReport_example
using RestSharp;

var client = new RestClient("https://api.moveworks.ai/rest/v1alpha1/eval_runs/eval_run_id/report");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift Eval runs_getEvalRunReport_example
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.moveworks.ai/rest/v1alpha1/eval_runs/eval_run_id/report")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```