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

# Queue a saved-revision presentation export

POST https://api.bibleit.app/v1/presentations/{presentation_id}/exports
Content-Type: application/json

**Required scopes:** `presentation.export`.

Captures an immutable saved-revision document and pins referenced media. Requires presentation.export only; asset.get and presentation.get are not required. Revision conflict returns 409; invalid slide/format returns 422; nonportable empty decks return 409. Formats: PDF, self-contained HTML ZIP, PNG/JPEG of one selected slide, portable bibleit ZIP. Portable export does not require Node/Chromium; HTML requires Node; PDF/images require Node and Chromium. Rendering errors are asynchronous safe job error codes, never paths/logs. Limits: 8 queued/running jobs globally, 2 per organization; at most 2 workers globally and 1 per organization; busy returns 409. Captured assets total at most 384 MiB; output at most 512 MiB. Initial and terminal retention ten minutes; worker lease five minutes. Expired jobs and files are cleaned up. Does not publish or change the deck. Optional Idempotency-Key supports 24-hour replay. Poll Location after Retry-After seconds. Optional Idempotency-Key atomically records a successful creation for 24-hour replay; current authorization is rechecked. Changed payload or original If-Match returns 409 idempotency_conflict. Replay precedes stale-version and quota evaluation. Replayed export jobs retain their original status/expiry; poll Location for current status and use a new key for a replacement expired job.

**Response headers:**

- `Cache-Control` (202).
- `Location` (202): Requester-private status resource URL.
- `Retry-After` (202).

Reference: https://docs.bibleit.dev/api-reference/organizations/presentation-exports/create-presentation-export

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

- `presentation_id` (string, required) — Organization-owned presentation UUID. Foreign decks return 404.

### Headers

- `Idempotency-Key` (string, optional) — Optional case-sensitive retry key, retained 24 hours from successful commit. Scoped to credential principal (stable service-token ID; personal bt_ credential; delegated OAuth grant), account and concrete method/path. Payload, If-Match, query string and Content-Type must match. JSON object key order is ignored; queue reference casing/defaults are normalized; raw upload/import bytes are hashed. Replays retain original success body, Location and ETag with a fresh X-Request-Id, after current authority/ownership/processing/library checks. Same scope/key with changed input:409 idempotency_conflict. Concurrent requests serialize; a contended retry lock can return 409 idempotency_in_progress; bounded database waits can return 503. Errors are not recorded. After expiry, a key is treated as new; original resource/job lifetime is unchanged. No key means no retry guarantee.

### Body (application/json)

This endpoint expects a CreatePresentationExport.

- `CreatePresentationExport`

## Response

### 202

Successful operation.

- `id` (string, required)
- `presentation_id` (string, required)
- `organization_id` (string, required)
- `revision` (integer, required)
- `format` (enum, required)
  - Allowed values: `pdf`, `html`, `png`, `jpeg`, `bibleit`
- `status` (enum, required)
  - Allowed values: `queued`, `running`, `completed`, `failed`
- `error` (enum, required)
  - Allowed values: `runtime_unavailable`, `export_cancelled`, `export_too_large`, `export_interrupted`, `export_failed`
- `bytes` (integer, required, nullable)
- `created_at` (integer, required)
- `expires_at` (integer, required)
- `download_url` (string, required, nullable) — Relative POST downloads URL, available only when completed. Requires the requesting credential and current presentation.export scope. Never a public URL.

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

### 409 Conflict Error

Domain conflict, changed idempotency input (idempotency_conflict), or concurrent retry lock contention (idempotency_in_progress).

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

### 422 Unprocessable Entity Error

Invalid input or invalid_idempotency_key.

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

### CreatePresentationExport0

- `revision` (integer, required)
- `format` (enum, required)
  - Allowed values: `pdf`, `html`, `bibleit`
- `locale` (enum, optional, default: en)
  - Allowed values: `en`, `pt`, `de`

### CreatePresentationExport1

- `revision` (integer, required)
- `format` (enum, required)
  - Allowed values: `png`, `jpeg`
- `slide_index` (integer, required) — Required zero-based index in this saved revision.
- `locale` (enum, optional, default: en)
  - Allowed values: `en`, `pt`, `de`

## Examples

### Example 1

**Request**

```json
{
  "format": "bibleit",
  "revision": 1
}
```

**Response**

```json
{
  "id": "string",
  "presentation_id": "string",
  "organization_id": "string",
  "revision": 1,
  "format": "pdf",
  "status": "queued",
  "error": null,
  "bytes": 1,
  "created_at": 1,
  "expires_at": 1,
  "download_url": "string"
}
```

**SDK Code**

```python Example 1
import requests

url = "https://api.bibleit.app/v1/presentations/presentation_id/exports"

payload = {
    "format": "bibleit",
    "revision": 1
}
headers = {
    "Idempotency-Key": "integration-7c642889-60eb-47ed-a16c-13e290e3f054",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```go Example 1
package main

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

func main() {

	url := "https://api.bibleit.app/v1/presentations/presentation_id/exports"

	payload := strings.NewReader("{\n  \"format\": \"bibleit\",\n  \"revision\": 1\n}")

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

	req.Header.Add("Idempotency-Key", "integration-7c642889-60eb-47ed-a16c-13e290e3f054")
	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))

}
```

### Example 2

**Request**

```json
{
  "format": "png",
  "locale": "de",
  "revision": 3,
  "slide_index": 0
}
```

**Response**

```json
{
  "id": "string",
  "presentation_id": "string",
  "organization_id": "string",
  "revision": 1,
  "format": "pdf",
  "status": "queued",
  "error": null,
  "bytes": 1,
  "created_at": 1,
  "expires_at": 1,
  "download_url": "string"
}
```

**SDK Code**

```python Example 2
import requests

url = "https://api.bibleit.app/v1/presentations/presentation_id/exports"

payload = {
    "format": "png",
    "locale": "de",
    "revision": 3,
    "slide_index": 0
}
headers = {
    "Idempotency-Key": "integration-7c642889-60eb-47ed-a16c-13e290e3f054",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```go Example 2
package main

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

func main() {

	url := "https://api.bibleit.app/v1/presentations/presentation_id/exports"

	payload := strings.NewReader("{\n  \"format\": \"png\",\n  \"locale\": \"de\",\n  \"revision\": 3,\n  \"slide_index\": 0\n}")

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

	req.Header.Add("Idempotency-Key", "integration-7c642889-60eb-47ed-a16c-13e290e3f054")
	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))

}
```