---
title: "Create Benchmark Upload"
method: POST
path: "/api/v1/benchmarks/uploads"
tags: ["benchmarks"]
---

# Create Benchmark Upload

`POST /api/v1/benchmarks/uploads`

Allocate signed GCS PUT URLs for one batch of files (manifest.json and task artifacts). Omit bench_id to mint a new benchmark; pass the returned bench_id on later calls to add more files to the same benchmark, which is how a file set over the per-request limit is uploaded. No rows are written until the ingest call.

## Request body

- BenchmarkUploadBatchRequest
  - `files` BenchmarkUploadFile[], required — Files to sign upload URLs for, one URL returned per declared path.
    - `path` string, required
    - `content_type` string, required
    - `size_bytes` integer, required
  - `bench_id` string, nullable — Omit to mint a new benchmark. Pass a bench_id returned by an earlier batch to add these files to that benchmark's upload prefix, which is how a file set larger than the per-request limit is uploaded. An already-ingested bench_id is rejected.

## Response `201`

Successful Response

- CreateBenchmarkUploadResponse
  - `bench_id` string, required
  - `urls` BenchmarkUploadUrl[], required
    - `path` string, required
    - `url` string, required
    - `headers` object, required
  - `expires_at` string, date-time, required

---

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