---
title: "Set the subtitle preset applied to every new clip edit"
method: PUT
path: "/api/me/subtitle-preset"
tags: ["account"]
---

# Set the subtitle preset applied to every new clip edit

`PUT /api/me/subtitle-preset`

## Request

- Base URL: `https://cliponit.app`
- URL: `https://cliponit.app/api/me/subtitle-preset`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `session`
  - OAuth 2 (authorization code, authorization URL `https://cliponit.app/oauth/authorize`, token URL `https://cliponit.app/oauth/token`, scopes: `clips`)

Fields are merged over the built-in defaults (`{}` resets), validated like `updateClipEdit`, then stored. Applied when a `clip_edits` row is created (first `getClip`/`updateClipEdit`/export of a clip+orientation); existing edits are not changed. Same plan gating as `updateClipEdit` for `lang`/`overrides`.

## Request body

- SubtitlesPatch: Partial subtitles patch: every field optional, merged field by field over the current values (or over the built-in defaults for the account preset). Same enums as `Subtitles`.
  - `enabled` boolean
  - `color` 'yellow' | 'white' | 'green' | 'cyan' | 'pink' | 'orange' | 'rainbow'
  - `case` 'normal' | 'upper' | 'lower'
  - `lang` string
  - `overrides` SubtitleOverride[]
    - `start` number, required
    - `end` number, required
    - `text` string, required
  - `style` 'karaoke' | 'boxed' | 'outline' | 'glow' | 'minimal'
  - `font` 'Inter' | 'Montserrat' | 'Bangers' | 'Poppins' | 'Arial'
  - `position` 'bottom' | 'middle' | 'top'
  - `size` 1 | 2 | 3
  - `words_per_line` integer
  - `animate` boolean
  - `hook` Hook: Title card burned at the top of the frame during the first `duration_s` seconds.
    - `enabled` boolean
    - `text` string, nullable: null = the clip title
    - `duration_s` number
    - `style` 'card' | 'plain'

## Response `200`

Stored preset

- Subtitles: Burned-in subtitles. All fields except the required ones have defaults and are always returned by `getClip`.
  - `enabled` boolean, required
  - `color` 'yellow' | 'white' | 'green' | 'cyan' | 'pink' | 'orange' | 'rainbow', required: Accent colour (current word in karaoke, text otherwise)
  - `case` 'normal' | 'upper' | 'lower', required
  - `lang` string, required: `original` or an ISO 639-1 code (`en`, `es`…) to translate — requires `translate` in the plan
  - `overrides` SubtitleOverride[]
    - `start` number, required
    - `end` number, required
    - `text` string, required
  - `style` 'karaoke' | 'boxed' | 'outline' | 'glow' | 'minimal'
  - `font` 'Inter' | 'Montserrat' | 'Bangers' | 'Poppins' | 'Arial'
  - `position` 'bottom' | 'middle' | 'top'
  - `size` 1 | 2 | 3: 52/64/80 px in 9:16 (×7/8 in 16:9)
  - `words_per_line` integer
  - `animate` boolean: Pop ×1.10 on the current word
  - `hook` Hook: Title card burned at the top of the frame during the first `duration_s` seconds.
    - `enabled` boolean
    - `text` string, nullable: null = the clip title
    - `duration_s` number
    - `style` 'card' | 'plain'

## Other responses

- `400`: Validation error — the message names the field, e.g. `champ subtitles.size invalide : attendu 1..3`
- `403`: Feature not included in the user's plan (upgrade at /billing)

---

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