---
title: "Public Upsert Eval Task"
method: POST
path: "/v1/evals"
tags: ["public-api"]
---

# Public Upsert Eval Task

`POST /v1/evals`

Create or update an eval task in a group — idempotent upsert by slug.

## Headers

- `authorization` string, nullable

## Request body

- EvalTaskUpsert — Idempotent upsert of a task (an Eval row) into a group by slug.
  - `slug` string, required
  - `display_name` string, required
  - `group_slug` string, required
  - `task` string, required — Task description shown on the task page
  - `criteria` object[] — Grading rubric entries ({id, question, rationale}), rendered as the task page's Verifiers card. Empty = leave the stored value unchanged.
  - `seed_data` string — Verbatim mock/seed source blocks — the task's starting world state, rendered as a collapsible card. Empty = leave the stored value unchanged.

## Response `200`

Successful Response

- EvalTaskResponse — A task (Eval) row as returned by the ingestion API.
  - `id` string, uuid, required
  - `team_id` string, uuid, required
  - `group_slug` string, required
  - `slug` string, required
  - `display_name` string, required
  - `task` string, required
  - `created_at` string, required
  - `updated_at` string, required

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/trainloop/apis/trainloop-api.md) · [All operations](https://skmtc.dev/trainloop/apis/trainloop-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/trainloop/trainloop-api/revisions/aedb0e4b59f8/schema)
