> 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.

# Edit Live metadata

PATCH https://api.bibleit.app/v1/lives/{live_id}
Content-Type: application/json

**Required scopes:** `live.update`.

Edits the name only. Omitted fields are preserved; unknown fields are rejected. No-op edits preserve ETag. Current scope, workspace and persisted sequence are rechecked under the workspace lock before an atomic save. Browser/command metadata edits also invalidate REST validators. Does not change display selection or playback state. Also accepts finite personal bearer tokens for resources owned by the caller’s personal account. Personal tokens cannot operate organization Lives, use collaborators’/children’s authority, or publish presentations. Current personal token scopes and user permissions are rechecked after waits. Registered delegated OAuth access tokens are accepted within these personal boundaries; /me and account metadata additionally require identity.read.

**Response headers:**

- `ETag` (200): Shared Live sequence validator. Any relevant metadata, display, playback or workspace change invalidates it.

Reference: https://docs.bibleit.dev/api-reference/lives/update-live-metadata

## 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.
- `Authorization` header (bearer token, required) — Personal bearer credential issued through existing account settings or browser-approved CLI flow. Must be active, finite, unexpired, unrevoked, within any rotation overlap, and bound to an active personal membership/user/account. Explicit scopes intersect current user permissions; empty existing personal scopes inherit current user authority. Not an OAuth grant or service token. Browser cookies are ignored.
- `Authorization` header (bearer token, required) — Registered public-client OAuth for personal-account resources only. Exact registered HTTPS or fixed-port literal loopback redirect; S256 required; explicit consent. No organization/presentation authority. identity.read is required for /me and account metadata. Scope intersection with current user authority; no empty-scope inheritance.

## Request

### Path parameters

- `live_id` (string, required)

### Headers

- `If-Match` (string, required) — Shared Live sequence validator. Any relevant metadata, display, playback or workspace change invalidates it. Missing:428; stale:412; malformed, weak, wildcard or list:422.

### Body (application/json)

This endpoint expects a LiveMetadataPatch.

- `name` (string, required) — Nonempty UTF-8 name, at most 128 bytes.

## Response

### 200

Successful operation

- `Lives_updateLiveMetadata_Response_200`

## 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

### Live

- `id` (string, required)
- `organization_id` (string, required)
- `name` (string, required)
- `status` (enum, required)
  - Allowed values: `running`, `stopped`
- `mode` (enum, required)
  - Allowed values: `reader`, `presentation`
- `paused` (boolean, required)
- `sequence` (integer, required)

### PersonalLive

Personal-account Reader Live resource. Uses account_id instead of organization_id; only the personal account owner can access it with current personal token authority.

- `id` (string, required)
- `name` (string, required)
- `status` (enum, required)
  - Allowed values: `running`, `stopped`
- `mode` ("reader", required)
- `paused` (boolean, required)
- `sequence` (integer, required)
- `account_id` (string, required)

## Examples

**Request**

```json
{
  "name": "Sunday evening"
}
```

**Response**

```json
{
  "id": "sample-live",
  "mode": "reader",
  "name": "Sunday Service",
  "organization_id": "00000000-0000-4000-8000-000000000001",
  "paused": false,
  "sequence": 0,
  "status": "stopped"
}
```

**SDK Code**

```python
import requests

url = "https://api.bibleit.app/v1/lives/live_id"

payload = { "name": "Sunday evening" }
headers = {
    "If-Match": "If-Match",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.patch(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/lives/live_id"

	payload := strings.NewReader("{\n  \"name\": \"Sunday evening\"\n}")

	req, _ := http.NewRequest("PATCH", 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))

}
```