---
title: "Add Public Lut"
method: POST
path: "/admin/public/luts"
tags: ["accepts-api-key"]
---

# Add Public Lut

`POST /admin/public/luts`

## Request

- Base URL: `https://api.tellers.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.tellers.ai/admin/public/luts`
- Auth: none declared

Publish a ``.cube`` LUT at ``/public/Tellers.ai/LUTs/<folders...>/<filename>``.

The asset has no owner, no creator and no group: ``is_public_read`` alone
makes it readable by every user. Its folders are public folders, created
when missing, and ``/public/Tellers.ai`` is shared with Everyone (VIEW)
unless it already is, so the library shows up in every user's "Shared with
me". It is stored as a ``lut`` asset with nothing to preprocess, the same
shape an uploaded ``.cube`` ends up in. The body is uploaded to the
matching key under ``public/Tellers.ai/LUTs/`` in the source-videos
bucket inside the same transaction that records it, so a failed upload
leaves no asset behind.

A second call for the same file name fails with 409 unless ``replace`` is
set, in which case the object and the metadata are overwritten in place and
the asset keeps its id.

## Headers

- `x-api-key` string, nullable
- `authorization` string, nullable

## Request body

- AddPublicLutRequest
  - `filename` string, required: File name the LUT is stored under in ``/public/Tellers.ai/LUTs``, ``.cube`` extension included. No directories: use ``folders``.
  - `folders` string[]: Sub-folders of ``/public/Tellers.ai/LUTs`` to store the LUT in, outermost first, e.g. ``["Sony", "FX3"]`` or ``["Fun"]``. Missing folders are created. Empty stores it at the top of the library.
  - `content` string, required: The .cube file body, verbatim (the format is plain text).
  - `title` string, nullable: Display title of the asset; defaults to the file name without extension.
  - `description` string, nullable: Free-text description of the look the LUT applies.
  - `keywords` string[]: Search keywords stored on the asset.
  - `replace` boolean: When a LUT already exists at this path, overwrite its object and metadata instead of failing with 409.

## Response `200`

Successful Response

- AddPublicLutResponse
  - `asset_id` string, required
  - `in_app_path` string, required
  - `file_s3_bucket` string, required
  - `file_s3_path` string, required
  - `file_size` integer, required
  - `mime_type` string, required
  - `replaced` boolean, required: True when an existing LUT at this path was overwritten.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/tellers/apis/tellers-api.md) - [All operations](https://skmtc.dev/tellers/apis/tellers-api/llms.txt) - [OpenAPI document](https://skmtc.dev/tellers/apis/tellers-api/revisions/fdaa0fa44a26?raw)
