> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.bibleit.dev/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.bibleit.dev/_mcp/server.

# Replace organization Live Studio settings

PUT https://api.bibleit.app/v1/organizations/{organization_id}/live-studio
Content-Type: application/json

**Required scopes:** `live_studio.update`.

Service-token organization UUID boundary applies; handles and foreign organization IDs return 404. Personal tokens and browser sessions are not accepted. Only organization_id, revision and normalized settings are returned; editor attribution and internal token principals are omitted. Requires a current strong Studio If-Match validator: missing 428, stale 412, malformed/weak/wildcard/list 422. Accepts settings only; revision is returned as metadata, not accepted in the body. Preserves existing domain validation and revision semantics. Complete settings are required except optional preset/transition defaults; invalid settings return 422 invalid_design. Identical PUTs still increment revision. Checks current explicit scope, organization status/verification and processing policy under the workspace lock. A processing restriction denies writes (403). Serializes with first saves, browser editor saves, credential changes and organization mutations. Concurrent writes with one validator produce one success and one 412. Persists before notifying organization Lives; changes styling without publishing presentation content or changing individual Live display/playback state. Transient notification failures do not turn a committed write into an error; reconnect/read loads the saved revision.

**Response headers:**

- `ETag` (200): Strong validator covering the effective settings and revision. Separate from Live playback/display sequence validators. Use unchanged as If-Match on PUT.

Reference: https://docs.bibleit.dev/api-reference/organizations/live-studio/replace-organization-live-studio

## Authentication

- `Authorization` header (bearer token, required) — Organization-owned service token. Issue the initial token in organization credential settings. Scopes are documented per operation via x-required-scopes; they are not OAuth scopes.

## Request

### Path parameters

- `organization_id` (string, required) — Immutable organization UUID bound to the service token.

### Headers

- `If-Match` (string, required) — Strong validator covering the effective settings and revision. Separate from Live playback/display sequence validators. Use unchanged as If-Match on PUT.

### Body (application/json)

This endpoint expects a PutOrganizationLiveStudio.

- `settings` (LiveStudioSettingsInput, required) — Full settings replacement using the existing version-1 Studio model. Only preset and transition may be omitted; they default to default and none. Every other field and all nested keys are required. Unknown fields are rejected at every level.

## Response

### 200

Current organization Live Studio settings

- `organization_id` (string, required)
- `revision` (integer, required) — Settings revision independent of any Live sequence. Zero represents unsaved defaults; every accepted PUT increments the revision, even for identical settings.
- `settings` (LiveStudioSettings, required)

## Errors

### 401 Unauthorized Error

Error response. 400 malformed JSON; 401 invalid/expired/revoked token; 403 denied scope or domain policy; 404 unknown/foreign resource; 405 unsupported method; 409 quota/conflict or stopped Live; 412 stale state validator; 428 missing If-Match; 413 body too large; 415 unsupported media type; 422 invalid fields; 429 admission budget exhausted; 503 unavailable dependency.

- `type` (any, required)
- `title` (string, required)
- `status` (integer, required)
- `code` (string, required)
- `request_id` (string, required)

### 403 Forbidden Error

Error response. 400 malformed JSON; 401 invalid/expired/revoked token; 403 denied scope or domain policy; 404 unknown/foreign resource; 405 unsupported method; 409 quota/conflict or stopped Live; 412 stale state validator; 428 missing If-Match; 413 body too large; 415 unsupported media type; 422 invalid fields; 429 admission budget exhausted; 503 unavailable dependency.

- `type` (any, required)
- `title` (string, required)
- `status` (integer, required)
- `code` (string, required)
- `request_id` (string, required)

### 404 Not Found Error

Error response. 400 malformed JSON; 401 invalid/expired/revoked token; 403 denied scope or domain policy; 404 unknown/foreign resource; 405 unsupported method; 409 quota/conflict or stopped Live; 412 stale state validator; 428 missing If-Match; 413 body too large; 415 unsupported media type; 422 invalid fields; 429 admission budget exhausted; 503 unavailable dependency.

- `type` (any, required)
- `title` (string, required)
- `status` (integer, required)
- `code` (string, required)
- `request_id` (string, required)

### 429 Too Many Requests Error

Error response. 400 malformed JSON; 401 invalid/expired/revoked token; 403 denied scope or domain policy; 404 unknown/foreign resource; 405 unsupported method; 409 quota/conflict or stopped Live; 412 stale state validator; 428 missing If-Match; 413 body too large; 415 unsupported media type; 422 invalid fields; 429 admission budget exhausted; 503 unavailable dependency.

- `type` (any, required)
- `title` (string, required)
- `status` (integer, required)
- `code` (string, required)
- `request_id` (string, required)

### 503 Service Unavailable Error

Error response. 400 malformed JSON; 401 invalid/expired/revoked token; 403 denied scope or domain policy; 404 unknown/foreign resource; 405 unsupported method; 409 quota/conflict or stopped Live; 412 stale state validator; 428 missing If-Match; 413 body too large; 415 unsupported media type; 422 invalid fields; 429 admission budget exhausted; 503 unavailable dependency.

- `type` (any, required)
- `title` (string, required)
- `status` (integer, required)
- `code` (string, required)
- `request_id` (string, required)

## Types

### LiveStudioSettingsInput

Full settings replacement using the existing version-1 Studio model. Only preset and transition may be omitted; they default to default and none. Every other field and all nested keys are required. Unknown fields are rejected at every level.

- `version` (enum, required)
  - Allowed values: `1`
- `showLogo` (boolean, required)
- `controls` (LiveStudioSettingsInputControls, required)
- `palettes` (LiveStudioSettingsInputPalettes, required)
- `container` (LiveStudioSettingsInputContainer, required)
- `elements` (LiveStudioSettingsInputElements, required)
- `order` (list of enum, required)
  - Allowed values: `translation`, `reference`, `text`
- `preset` (enum, optional, default: default)
  - Allowed values: `default`, `midnight`, `paper`, `ocean`
- `transition` (enum, optional, default: none)
  - Allowed values: `none`, `fade`, `slide`, `slide_up`, `slide_down`, `zoom_in`, `zoom_out`, `wipe`

### LiveStudioSettings

- `version` (enum, required)
  - Allowed values: `1`
- `showLogo` (boolean, required)
- `preset` (enum, required, default: default)
  - Allowed values: `default`, `midnight`, `paper`, `ocean`
- `transition` (enum, required, default: none)
  - Allowed values: `none`, `fade`, `slide`, `slide_up`, `slide_down`, `zoom_in`, `zoom_out`, `wipe`
- `controls` (LiveStudioSettingsControls, required)
- `palettes` (LiveStudioSettingsPalettes, required)
- `container` (LiveStudioSettingsContainer, required)
- `elements` (LiveStudioSettingsElements, required)
- `order` (list of enum, required)
  - Allowed values: `translation`, `reference`, `text`

### LiveStudioSettingsInputControls

- `theme` (boolean, required)
- `fullscreen` (boolean, required)
- `fontSize` (boolean, required)

### LiveStudioSettingsInputPalettes

- `dark` (LiveStudioSettingsInputPalettesDark, required)
- `light` (LiveStudioSettingsInputPalettesLight, required)

### LiveStudioSettingsInputContainer

- `radius` (integer, required, nullable)
- `padding` (integer, required, nullable)
- `border` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.

### LiveStudioSettingsInputElements

- `translation` (LiveStudioSettingsInputElementsTranslation, required)
- `reference` (LiveStudioSettingsInputElementsReference, required)
- `text` (LiveStudioSettingsInputElementsText, required)

### LiveStudioSettingsControls

- `theme` (boolean, required)
- `fullscreen` (boolean, required)
- `fontSize` (boolean, required)

### LiveStudioSettingsPalettes

- `dark` (LiveStudioSettingsPalettesDark, required)
- `light` (LiveStudioSettingsPalettesLight, required)

### LiveStudioSettingsContainer

- `radius` (integer, required, nullable)
- `padding` (integer, required, nullable)
- `border` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.

### LiveStudioSettingsElements

- `translation` (LiveStudioSettingsElementsTranslation, required)
- `reference` (LiveStudioSettingsElementsReference, required)
- `text` (LiveStudioSettingsElementsText, required)

### LiveStudioSettingsInputPalettesDark

- `background` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `container` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `translation` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `reference` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `text` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.

### LiveStudioSettingsInputPalettesLight

- `background` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `container` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `translation` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `reference` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `text` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.

### LiveStudioSettingsInputElementsTranslation

- `font` (enum, required)
  - Allowed values: `serif`, `sans`, `mono`
- `size` (integer, required)
- `bold` (boolean, required)
- `italic` (boolean, required)
- `align` (enum, required)
  - Allowed values: `left`, `center`, `right`
- `lineHeight` (integer, required)

### LiveStudioSettingsInputElementsReference

- `font` (enum, required)
  - Allowed values: `serif`, `sans`, `mono`
- `size` (integer, required)
- `bold` (boolean, required)
- `italic` (boolean, required)
- `align` (enum, required)
  - Allowed values: `left`, `center`, `right`
- `lineHeight` (integer, required)

### LiveStudioSettingsInputElementsText

- `font` (enum, required)
  - Allowed values: `serif`, `sans`, `mono`
- `size` (integer, required)
- `bold` (boolean, required)
- `italic` (boolean, required)
- `align` (enum, required)
  - Allowed values: `left`, `center`, `right`
- `lineHeight` (integer, required)

### LiveStudioSettingsPalettesDark

- `background` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `container` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `translation` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `reference` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `text` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.

### LiveStudioSettingsPalettesLight

- `background` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `container` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `translation` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `reference` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.
- `text` (string, required, nullable) — Six-digit hexadecimal color; null inherits the selected preset.

### LiveStudioSettingsElementsTranslation

- `font` (enum, required)
  - Allowed values: `serif`, `sans`, `mono`
- `size` (integer, required)
- `bold` (boolean, required)
- `italic` (boolean, required)
- `align` (enum, required)
  - Allowed values: `left`, `center`, `right`
- `lineHeight` (integer, required)

### LiveStudioSettingsElementsReference

- `font` (enum, required)
  - Allowed values: `serif`, `sans`, `mono`
- `size` (integer, required)
- `bold` (boolean, required)
- `italic` (boolean, required)
- `align` (enum, required)
  - Allowed values: `left`, `center`, `right`
- `lineHeight` (integer, required)

### LiveStudioSettingsElementsText

- `font` (enum, required)
  - Allowed values: `serif`, `sans`, `mono`
- `size` (integer, required)
- `bold` (boolean, required)
- `italic` (boolean, required)
- `align` (enum, required)
  - Allowed values: `left`, `center`, `right`
- `lineHeight` (integer, required)

## Examples

**Request**

```json
{
  "settings": {
    "version": 1,
    "showLogo": true,
    "controls": {
      "theme": true,
      "fullscreen": true,
      "fontSize": true
    },
    "palettes": {
      "dark": {
        "background": null,
        "container": null,
        "translation": null,
        "reference": null,
        "text": null
      },
      "light": {
        "background": null,
        "container": null,
        "translation": null,
        "reference": null,
        "text": null
      }
    },
    "container": {
      "radius": null,
      "padding": null,
      "border": null
    },
    "elements": {
      "translation": {
        "font": "sans",
        "size": 100,
        "bold": true,
        "italic": false,
        "align": "left",
        "lineHeight": 112
      },
      "reference": {
        "font": "sans",
        "size": 100,
        "bold": true,
        "italic": false,
        "align": "left",
        "lineHeight": 112
      },
      "text": {
        "font": "serif",
        "size": 100,
        "bold": false,
        "italic": false,
        "align": "left",
        "lineHeight": 112
      }
    },
    "order": [
      "translation",
      "reference",
      "text"
    ],
    "preset": "default",
    "transition": "none"
  }
}
```

**Response**

```json
{
  "organization_id": "string",
  "revision": 1,
  "settings": {
    "version": 1,
    "showLogo": true,
    "preset": "default",
    "transition": "none",
    "controls": {
      "theme": true,
      "fullscreen": true,
      "fontSize": true
    },
    "palettes": {
      "dark": {
        "background": null,
        "container": null,
        "translation": null,
        "reference": null,
        "text": null
      },
      "light": {
        "background": null,
        "container": null,
        "translation": null,
        "reference": null,
        "text": null
      }
    },
    "container": {
      "radius": null,
      "padding": null,
      "border": null
    },
    "elements": {
      "translation": {
        "font": "sans",
        "size": 100,
        "bold": true,
        "italic": false,
        "align": "left",
        "lineHeight": 112
      },
      "reference": {
        "font": "sans",
        "size": 100,
        "bold": true,
        "italic": false,
        "align": "left",
        "lineHeight": 112
      },
      "text": {
        "font": "serif",
        "size": 100,
        "bold": false,
        "italic": false,
        "align": "left",
        "lineHeight": 112
      }
    },
    "order": [
      "translation",
      "reference",
      "text"
    ]
  }
}
```

**SDK Code**

```python
import requests

url = "https://api.bibleit.app/v1/organizations/organization_id/live-studio"

payload = { "settings": {
        "version": 1,
        "showLogo": True,
        "controls": {
            "theme": True,
            "fullscreen": True,
            "fontSize": True
        },
        "palettes": {
            "dark": {
                "background": None,
                "container": None,
                "translation": None,
                "reference": None,
                "text": None
            },
            "light": {
                "background": None,
                "container": None,
                "translation": None,
                "reference": None,
                "text": None
            }
        },
        "container": {
            "radius": None,
            "padding": None,
            "border": None
        },
        "elements": {
            "translation": {
                "font": "sans",
                "size": 100,
                "bold": True,
                "italic": False,
                "align": "left",
                "lineHeight": 112
            },
            "reference": {
                "font": "sans",
                "size": 100,
                "bold": True,
                "italic": False,
                "align": "left",
                "lineHeight": 112
            },
            "text": {
                "font": "serif",
                "size": 100,
                "bold": False,
                "italic": False,
                "align": "left",
                "lineHeight": 112
            }
        },
        "order": ["translation", "reference", "text"],
        "preset": "default",
        "transition": "none"
    } }
headers = {
    "If-Match": "If-Match",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.json())
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.bibleit.app/v1/organizations/organization_id/live-studio"

	payload := strings.NewReader("{\n  \"settings\": {\n    \"version\": 1,\n    \"showLogo\": true,\n    \"controls\": {\n      \"theme\": true,\n      \"fullscreen\": true,\n      \"fontSize\": true\n    },\n    \"palettes\": {\n      \"dark\": {\n        \"background\": null,\n        \"container\": null,\n        \"translation\": null,\n        \"reference\": null,\n        \"text\": null\n      },\n      \"light\": {\n        \"background\": null,\n        \"container\": null,\n        \"translation\": null,\n        \"reference\": null,\n        \"text\": null\n      }\n    },\n    \"container\": {\n      \"radius\": null,\n      \"padding\": null,\n      \"border\": null\n    },\n    \"elements\": {\n      \"translation\": {\n        \"font\": \"sans\",\n        \"size\": 100,\n        \"bold\": true,\n        \"italic\": false,\n        \"align\": \"left\",\n        \"lineHeight\": 112\n      },\n      \"reference\": {\n        \"font\": \"sans\",\n        \"size\": 100,\n        \"bold\": true,\n        \"italic\": false,\n        \"align\": \"left\",\n        \"lineHeight\": 112\n      },\n      \"text\": {\n        \"font\": \"serif\",\n        \"size\": 100,\n        \"bold\": false,\n        \"italic\": false,\n        \"align\": \"left\",\n        \"lineHeight\": 112\n      }\n    },\n    \"order\": [\n      \"translation\",\n      \"reference\",\n      \"text\"\n    ],\n    \"preset\": \"default\",\n    \"transition\": \"none\"\n  }\n}")

	req, _ := http.NewRequest("PUT", url, payload)

	req.Header.Add("If-Match", "If-Match")
	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```