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

# Presentations and files

> Separate saved documents, published revisions and temporary files.

Create a presentation in its organization, then save a validated document with
the presentation ETag in `If-Match`. Saving advances its saved revision and never
publishes to a Live. Publish explicitly through the Live display resource with
the presentation ID, exact saved revision and current Live ETag. Publishing needs
`presentation.present` and `live.update`, in the same workspace. A later save or
source deletion does not silently replace an existing immutable Live snapshot.

Upload raw image/video bytes to a presentation's `/assets?kind=image` or `video`
resource with `asset.create` and `presentation.update`. Supply exact Content-Length
and identity encoding; do not send multipart or base64 JSON. Images are limited
to 10 MiB and videos to 64 MiB, with format, dimension and codec validation.
The returned asset URL remains bearer-protected. Staged assets expire after
24 hours unless retained by a saved document. Asset reads support one byte range.

Import a self-contained `.bibleit` ZIP through the organization's
`/presentation-imports` collection. Imports require `presentation.import`,
`presentation.create`, `presentation.update` and `asset.create`. They validate
paths, checksums, media and document bounds, allocate fresh IDs, commit atomically
and never publish. The compressed limit is 512 MiB; expanded media and manifest
limits also apply. A different key does not bypass duplicate bundle detection.

Exports are asynchronous saved-revision jobs. Create one under the presentation's
`/exports` collection with `presentation.export`, then poll its Location after
Retry-After. Jobs are requester-private; formats are portable `.bibleit`, PDF,
HTML ZIP, PNG and JPEG. PNG/JPEG select one slide. Rendering availability depends
on the server's renderer. Job failures return safe error codes, never server paths.

Download a completed export by POSTing `{}` to its `/downloads` resource. The
stream consumes the job once. GET/HEAD do not consume; ranges and resume are not
supported. A lost successful download requires a new export with a new creation
key. A replay of export creation returns its original response and expiry; it does
not regenerate a consumed or expired file. Jobs have short retention, so download
promptly. No export URL is public.