---
title: "Get an upload URL for an environment episode artifact"
method: POST
path: "/v1/validator/episode-artifacts/presign"
tags: ["validator"]
---

# Get an upload URL for an environment episode artifact

`POST /v1/validator/episode-artifacts/presign`

Return a content-addressed upload target for an evaluation owned by the caller.

## Request body

- EpisodeArtifactPresignRequest — Request an immutable upload target for one environment episode.
  - `eval_run_id` string, uuid, required
  - `env_pack_sha256` string, required
  - `artifact_sha256` string, required
  - `content_length` integer, required

## Response `200`

Successful Response

- EpisodeArtifactPresignResponse — Content-addressed S3 target returned to the owning validator.
  - `upload_url` string, required
  - `artifact_uri` string, required
  - `artifact_sha256` string, required

## Other responses

- `401` — Missing or invalid authentication.
- `403` — Caller is not authorized.
- `404` — Evaluation or pack not found.
- `413` — Artifact exceeds the upload size limit.
- `422` — Validation Error
- `429` — Request rate limited; honor Retry-After before retrying.
- `500` — The request could not be completed.
- `503` — A service is temporarily unavailable.

## Changes

- **2026-09-14** `b53d2cf1bdf6` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/oroagents/apis/oro-api/changes/v1/validator/episode-artifacts/presign/post.md)

---

[API](https://skmtc.dev/oroagents/apis/oro-api.md) · [All operations](https://skmtc.dev/oroagents/apis/oro-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oroagents/apis/oro-api/revisions/3e921f170eed?raw)
