---
title: "Write Captured Artifact Content"
method: PUT
path: "/api/v1/runs/{id}/artifacts/content/{digest}"
tags: ["Run Internals"]
---

# Write Captured Artifact Content

`PUT /api/v1/runs/{id}/artifacts/content/{digest}`

## Request

- The document declares no server URL.
- Auth: one of:
  - HTTP bearer
  - API key in cookie `__fabro_session`

Stores captured file bytes in the configured artifact backend for this run. Requires a worker token belonging to the run. The body is limited to 10 MiB and must match the SHA-256 digest. Repeating the same upload is safe. Uploading content alone does not create an artifact listing entry.

## Path parameters

- `id` string, required
- `digest` string, required: Content-addressed SHA-256 hash of a stored blob. Hex input is case-insensitive; Fabro emits the canonical lowercase form.

## Request body `application/octet-stream`

- string, binary

## Response `204`

Complete content stored

## Other responses

- `400`: Invalid digest or digest does not match the body
- `401`: Authentication required
- `403`: A worker token belonging to this run is required
- `404`: Run not found
- `409`: Run is archived
- `413`: Content exceeds 10 MiB
- `500`: Artifact storage failed

## Changes

- **2026-09-24** `f14dced692d7`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/fabro-sh/apis/fabro-run-api/changes/api/v1/runs/:id/artifacts/content/:digest/put.md)

---

[API](https://skmtc.dev/fabro-sh/apis/fabro-run-api.md) - [All operations](https://skmtc.dev/fabro-sh/apis/fabro-run-api/llms.txt) - [OpenAPI document](https://skmtc.dev/fabro-sh/apis/fabro-run-api/revisions/1b795eeb69bb?raw)
