> ## Documentation Index
> Fetch the complete documentation index at: https://docs.okrapdf.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Upload, Extract, Publish

> Session-first workflow: create session, wait, publish, and use deterministic URLs.

## Overview

This cookbook follows the minimal SDK surface:

1. `okra.sessions.create(...)`
2. `session.wait()` (optional if `wait: true`)
3. `session.publish()`
4. `doc(session.id)` for URL generation

## Minimal example

```ts theme={null}
import { createOkra, doc } from '@okrapdf/runtime';

const okra = createOkra({ apiKey: process.env.OKRA_API_KEY });

const session = await okra.sessions.create('https://example.com/report.pdf', {
  wait: true,
});

await session.publish();

const d = doc(session.id);
console.log(d.thumbnail.url());
console.log(d.pages[0].image.url());
console.log(d.pages[0].markdown.url());
console.log(d.entities.tables[0].url({ format: 'csv' }));
```

## Inputs

`sessions.create` supports:

* URL string
* local file path (Node.js)
* `File` / `Blob`
* `ArrayBuffer` / `Uint8Array`
* existing document ID (attach mode)

```ts theme={null}
const fromUrl = await okra.sessions.create('https://example.com/report.pdf', { wait: true });
const fromPath = await okra.sessions.create('./reports/Q3-2024.pdf', { wait: true });
const fromId = okra.sessions.from('ocr_existing_doc_id');
```

## Private vs Public

Documents are private by default. To publish, call:

```ts theme={null}
await session.publish();
```

Or set upload visibility on create:

```ts theme={null}
const session = await okra.sessions.create('./report.pdf', {
  wait: true,
  upload: { visibility: 'public' },
});
```

## Curl equivalent

```bash theme={null}
curl -X POST "https://api.okrapdf.com/document/ocr-demo/upload-url" \
  -H "Authorization: Bearer $OKRA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/report.pdf","visibility":"private"}'

curl "https://api.okrapdf.com/document/ocr-demo/status" \
  -H "Authorization: Bearer $OKRA_API_KEY"

curl -X POST "https://api.okrapdf.com/document/ocr-demo/publish" \
  -H "Authorization: Bearer $OKRA_API_KEY"
```
