---
title: "PRD-023A — idempotent, audited admin catalog-task creation"
method: POST
path: "/api/v1/admin/tasks"
tags: ["admin"]
---

# PRD-023A — idempotent, audited admin catalog-task creation

`POST /api/v1/admin/tasks`

## Request

- Base URL: `https://api.badgeia.com`
- URL: `https://api.badgeia.com/api/v1/admin/tasks`
- Auth: none declared. Required headers: `Idempotency-Key`

Create one catalog task without duplicate or unaudited writes.

A response-lost retry presents the same idempotency UUID and receives the
existing metadata-only response. The task row and ADMIN_TASK_CREATED audit
row flush and commit in one transaction. Audit failure raises before the
commit, so request-session teardown rolls the task back.

Neither response nor audit detail contains description, prompt, or grading
answer. Anonymous → 401, non-admin → 403, dashboard flag off → 404.

## Headers

- `Idempotency-Key` string, required: One UUID per deliberate create attempt.

## Request body

- AdminTaskCreate: Secret-safe body for POST /admin/tasks. The legacy global task endpoint remains backward compatible. This stricter admin surface trims every text field before validation, defaults holdout protection on, and refuses a malformed secret suite row at the server boundary even if a client bypasses the browser form.
  - `title` string, required
  - `description` string, required
  - `domain` 'code_generation' | 'data_extraction' | 'tool_use' | 'customer_support' | 'rag' | 'research' | 'writing' | 'reasoning' | 'custom'
  - `difficulty` 'easy' | 'medium' | 'hard'
  - `prompt` string, required
  - `max_tokens_hint` integer
  - `expected_output` string, nullable
  - `is_secret` boolean
  - `suite_id` string, nullable
  - `suite_version` integer

## Response `201`

Successful Response

- AdminTaskCreateResult: Metadata-only create response. Never echoes authored task contents.
  - `id` string, uuid, required
  - `title` string, required
  - `domain` 'code_generation' | 'data_extraction' | 'tool_use' | 'customer_support' | 'rag' | 'research' | 'writing' | 'reasoning' | 'custom', required
  - `difficulty` 'easy' | 'medium' | 'hard', required
  - `is_secret` boolean, required
  - `suite_id` string, nullable, required
  - `suite_version` integer, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/badgeia/apis/badge.md) · [All operations](https://skmtc.dev/badgeia/apis/badge/llms.txt) · [OpenAPI document](https://skmtc.dev/badgeia/apis/badge/revisions/7e7f7fee8b77?raw)
