> 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 queue ordering

PUT https://api.bibleit.app/v1/lives/{live_id}/queue-items/order
Content-Type: application/json

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

These resources represent the existing scripture stack published to the Live, not a separate draft playlist. Items are one canonical verse in one translation. IDs are scoped by Live, opaque, stable through reorder/metadata changes/restart, and change when a deleted item is recreated. Presentation mode returns 409 for queue reads/writes. Requires current If-Match; missing:428, stale:412, invalid:422. Current service scopes, organization ownership/status/processing and persisted sequence are rechecked before saving. Stopped Lives return 409. Changes persist before audience publication, switch/retain Reader mode, show remaining verses and resume a paused Live; deleting the last item clears the display. Accepts the complete current set of stable item IDs exactly once, in desired order. Unknown, duplicate, extra or omitted IDs return 422 invalid_queue_order. An identical order is a no-op preserving ETag and playback/visibility. Maximum 100 IDs; legacy larger stacks remain readable/removable until reduced below that limit. Returns the ordered snapshot. 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/replace-live-queue-order

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

- `item_ids` (list of string, required) — Complete permutation of the current item IDs. Missing, extra, foreign or duplicate IDs return 422. Empty is valid only for an empty queue.

## Response

### 200

Successful operation

- `Lives_replaceLiveQueueOrder_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

### LiveQueuePage

- `live_id` (string, required)
- `organization_id` (string, required)
- `sequence` (integer, required)
- `data` (list of LiveQueueItem, required)
- `next_cursor` (string, required, nullable) — Opaque sequence-bound cursor. Pass unchanged as after. Any intervening Live sequence change returns 409; malformed/unknown cursor returns 422.

### PersonalLiveQueuePage

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.

- `live_id` (string, required)
- `sequence` (integer, required)
- `data` (list of LiveQueueItem, required)
- `next_cursor` (string, required, nullable) — Opaque sequence-bound cursor. Pass unchanged as after. Any intervening Live sequence change returns 409; malformed/unknown cursor returns 422.
- `account_id` (string, required)

### LiveQueueItem

- `id` (string, required) — Opaque stable queue item ID. Preserved through reordering, metadata edits and restart; removing/recreating a verse yields a new ID.
- `position` (integer, required) — Zero-based position in the entire current queue, not the current page.
- `verse` (DisplayVerse, required)

### DisplayVerse

- `book_id` (integer, required)
- `book` (string, required)
- `chapter` (integer, required)
- `verse` (integer, required)
- `text` (string, required)
- `translation` (string, required)
- `rights` (TranslationRights, required)
- `attribution` (string, required)

### TranslationRights

- `edition` (string, required)
- `rights_status` (string, required)
- `source_url` (string, required)
- `attribution` (string, required)
- `license_id` (string, optional)
- `license_url` (string, optional)
- `copyright` (string, optional)
- `change_notice` (string, optional)

## Examples

**Request**

```json
{
  "item_ids": []
}
```

**Response**

```json
{
  "data": [
    {
      "id": "string",
      "position": 1,
      "verse": {
        "attribution": "string",
        "book": "string",
        "book_id": 1,
        "chapter": 1,
        "rights": {
          "attribution": "string",
          "change_notice": "string",
          "copyright": "string",
          "edition": "string",
          "license_id": "string",
          "license_url": "string",
          "rights_status": "string",
          "source_url": "string"
        },
        "text": "string",
        "translation": "string",
        "verse": 1
      }
    }
  ],
  "live_id": "string",
  "next_cursor": "string",
  "organization_id": "string",
  "sequence": 1
}
```

**SDK Code**

```python
import requests

url = "https://api.bibleit.app/v1/lives/live_id/queue-items/order"

payload = { "item_ids": [] }
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/lives/live_id/queue-items/order"

	payload := strings.NewReader("{\n  \"item_ids\": []\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))

}
```