{"info":{"name":"PaperOffice AI API","_postman_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json","description":"# PaperOffice AI API\n\n## Documentation release\n\n**`R20260721.1103`** — compare with [paperoffice.ai](https://paperoffice.ai) (site footer). Re-import if stale: `GET https://api.paperoffice.ai/latest/docs/postman`\n\n---\n\n## LLM-first (use this for coding — not this JSON file)\n\n> **Cursor / Claude / ChatGPT / Windsurf:** Do **not** paste this Postman collection (about 592 KB) into a prompt.\n> Use the **llmstxt.org** exports instead (approx. 28× smaller, built for agents):\n>\n> | Resource | URL |\n> |----------|-----|\n> | **Full spec (recommended)** | [llms-full.txt](https://api.paperoffice.ai/latest/docs/llms-full.txt) |\n> | **Hub / index** | [llms.txt](https://api.paperoffice.ai/latest/docs/llms.txt) |\n> | **Developer page** | [paperoffice.ai/l/developer-llms](https://paperoffice.ai/l/developer-llms/) (EN: [paperoffice.ai/en/developer/llms](https://paperoffice.ai/en/developer/llms/)) |\n> | **MCP (DMS)** | [mcp.paperoffice.ai/dms](https://mcp.paperoffice.ai/dms) |\n> | **MCP (Claude)** | [mcp.paperoffice.ai/claude](https://mcp.paperoffice.ai/claude) (alias of /dms) |\n> | **MCP (Cursor)** | [mcp.paperoffice.ai/cursor](https://mcp.paperoffice.ai/cursor) |\n> | **MCP (ChatGPT)** | [mcp.paperoffice.ai/openai](https://mcp.paperoffice.ai/openai) |\n\n**Example prompt:**\n```\nRead https://api.paperoffice.ai/latest/docs/llms-full.txt\nDocumentation release: R20260721.1103\nImplement OCR for a PDF using the job API.\n```\n\n---\n\n## Start here (Postman / humans)\n\nOpen **🚀 Introduction & Basics** → **Quickstart Tutorial** ①–④, then **Guides** (release, LLM-first, auth, jobs).\n\n## Authentication\n\n```http\nAuthorization: Bearer YOUR_TOKEN\n```\n\n`po_sk_` server · `po_ut_` user · `po_pk_` browser-safe. No token = VISITOR (`/docs/*`, `GET /health`, `GET /ping`, public compliance verify).\n\n## Export URL\n\n```\nhttps://api.paperoffice.ai/latest/docs/postman\n```\n\n---\n\n*Product APIs: browse folders A–Z. Request footers may show `Documentation release: …`*\n\n*Generated: July 2026 · Release `R20260721.1103`*\n"},"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{bearer_token}}","type":"string"}]},"event":[],"variable":[{"key":"base_url","value":"https://api.paperoffice.ai/latest","type":"string","description":"API base URL for this export. Production: https://api.paperoffice.ai/latest · Requests in this collection use the `{{base_url}}` variable."},{"key":"bearer_token","value":"","type":"string","description":"Your API access token (REQUIRED for most endpoints). Get it at paperoffice.ai. Format: po_sk_xxx (System Key), po_ut_xxx (User Token), or po_pk_xxx (Publishable Key). Set once here — collection auth uses `{{bearer_token}}`. Without a Bearer token the API assigns **VISITOR** auto-tier per IP (rate-limited): `/docs/*`, `GET /health`, `GET /ping`, public compliance verify. Product APIs (`/ip2location/*`, `/currency_exchange/*`, `/geocoding/*`, jobs, …) require `po_sk_`, `po_ut_`, or `po_pk_`."},{"key":"priority","value":"100","type":"string","description":"Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit for your subscription plan default."},{"key":"client_wait","value":"true","type":"string","description":"Connection hold: true (default) = wait on this HTTP request until the job finishes or the pipeline timeout is reached (dynamic per pipeline/priority/pages, typically 20s–several minutes, hard cap ~295s infrastructure limit). Then inline result or HTTP 202 + poll_url + max_wait_seconds. false = immediate job_id. Same as async_only=true."},{"key":"job_id","value":"","type":"string","description":"Opaque job ID from step ③ (auto-set by test script) or from `job_id` / `poll_url` in any async submit. Use with GET /job/get/{{job_id}} — path only, not as query parameter."},{"key":"download_token","value":"","type":"string","description":"Optional — only for **Guides → GET Download result file**, not the Quickstart. Copy the last path segment from a `/job/download/…` URL in `job_result` (step ④), if present. Not the same as `job_id`."},{"key":"pipeline","value":"paperoffice_aiocr___generate","type":"string","description":"Full pipeline name for /job/add/{pipeline}. Default demo: paperoffice_aiocr___generate. Use triple underscores (___), not dots. See each endpoint for its specific pipeline name."},{"key":"subscription_id","value":"","type":"string","description":"Webhook subscription ID from subscribe or list (webhooks/update, test, delete)."},{"key":"note_id","value":"","type":"string","description":"Document note ID from notes-list or note-create."},{"key":"comment_id","value":"","type":"string","description":"Document comment ID from comments-list or comment-create."},{"key":"type_id","value":"","type":"string","description":"Document type ID from document-types-list or document-types-create."},{"key":"mount_id","value":"","type":"string","description":"Storage mount ID (source) for storage-mount-mirror."},{"key":"mount_id_2","value":"","type":"string","description":"Target storage mount ID — must differ from mount_id."},{"key":"pofid_2","value":"","type":"string","description":"Second document POFID for merge, folder-create, and multi-file jobs."},{"key":"import_job_id","value":"","type":"string","description":"Import job ID from import-create (import status/cancel endpoints)."},{"key":"import_temp_file_id","value":"","type":"string","description":"temp_file_id from POST /import/upload-source (use in import-create source_config.temp_file_id — do not use internal server paths)."},{"key":"invoice_number","value":"INV-2026-001","type":"string","description":"Sample invoice number placeholder for document template examples."},{"key":"customer_name","value":"Acme GmbH","type":"string","description":"Sample customer name placeholder for document template examples."},{"key":"documentation_release_id","value":"R20260721.1103","type":"string","description":"Documentation release ID for this export (format RYYYYMMDD.HHMM, UTC). Compare with the release on paperoffice.ai. For AI coding prefer llms-full.txt — see Introduction → Guides."},{"key":"z","value":"6","type":"string","description":"Map tile zoom (GET Get map tile path parameter)."},{"key":"x","value":"34","type":"string","description":"Map tile X index (GET Get map tile path parameter)."},{"key":"y","value":"24","type":"string","description":"Map tile Y index (GET Get map tile path parameter)."},{"key":"pofid","value":"","type":"string","description":"PaperOffice File ID (POFID) from upload/list/get endpoints. Example: DS50.POD5.AI15.MT0000000000000.pdf"},{"key":"documents_id","value":"0","type":"string","description":"Synthetic placeholder document ID — replace with a real documents_id from your tenant before Send."},{"key":"workspace_id","value":"","type":"string","description":"Workspace ID for DMS-scoped requests (set to your test workspace, e.g. from workspaces-list)."},{"key":"template_id","value":"","type":"string","description":"Document generation template ID from templates-list or template-create."},{"key":"workflow_id","value":"","type":"string","description":"System workflow ID from GET /workflow/system_list (workflow/system_get)."},{"key":"share_token","value":"","type":"string","description":"Workspace share token for GET /paperoffice_account/share_info."},{"key":"partner_name","value":"Acme GmbH","type":"string","description":"Partner/company name for Knowledge Graph partner endpoints."},{"key":"publisher_id","value":"","type":"string","description":"Publisher ID for AI document operations publisher endpoints."},{"key":"crm_account_id","value":"crm_account_001","type":"string","description":"CRM account ID for CRM-scoped API calls."},{"key":"request_id","value":"","type":"string","description":"Signing-link request ID (signature_requests.id). Legacy alias: signing_id."},{"key":"signing_id","value":"{{request_id}}","type":"string","description":"Legacy alias for request_id (signature_requests.id) — same value as {{request_id}}."},{"key":"page_number","value":"1","type":"string","description":"1-based page number for GET /documents/document-thumb-get/{pofid}/{page_number}."}],"item":[{"name":"🚀 Introduction & Basics","description":"# Introduction & Basics\n\n**Start here.** This folder is the **inline API documentation** for PaperOffice — there is no separate developer portal.\n\n## Documentation release\n\n**Active API documentation release:** `R20260721.1103`\n\nThis ID is generated when the live Postman collection is built (`GET https://api.paperoffice.ai/latest/docs/postman`). Compare it with the documentation release shown in the site footer on [paperoffice.ai](https://paperoffice.ai). If they differ, **re-download** the collection or point your AI at fresh **llms.txt** exports.\n\nCurated requests may end with a footer line: `Documentation release: R20260721.1103`.\n\n---\n\n## LLM-first (read this before coding)\n\nFor **Cursor, Claude, ChatGPT, and other agents**, use **[llms-full.txt](https://api.paperoffice.ai/latest/docs/llms-full.txt)** (not this Postman file). Hub: [llms.txt](https://api.paperoffice.ai/latest/docs/llms.txt) · Landing: [paperoffice.ai/l/developer-llms](https://paperoffice.ai/l/developer-llms/) (EN: [paperoffice.ai/en/developer/llms](https://paperoffice.ai/en/developer/llms/)). Open **Guides → LLM-first integration** for copy-paste prompts. **MCP:** DMS `https://mcp.paperoffice.ai/dms` · Claude `https://mcp.paperoffice.ai/claude` (alias) · Cursor `https://mcp.paperoffice.ai/cursor` · ChatGPT `https://mcp.paperoffice.ai/openai`.\n\n---\n\n## Structure (four zones)\n\n| Zone | Folder | Purpose |\n|------|--------|----------|\n| **Tutorial** | Quickstart Tutorial | Numbered **①–④** — public docs → pricing (Bearer) → submit job → **get result (finish here)** |\n| **Guides** | Guides | Release notice, **LLM-first coding**, Authentication, Priority & jobs |\n| **Integration** | Integration & Discovery | MCP meta, Postman export, llms URLs |\n| **Reference** | Reference | **Errors & status codes** (global — not repeated per endpoint) |\n\n---\n\n## What you need before any AI pipeline\n\n1. **Bearer token** — `Authorization: Bearer YOUR_TOKEN` (see **Guides → Authentication**).\n2. **Job pattern** — most processing uses `POST /job/add/{pipeline}` (see **Quickstart Tutorial** step ③).\n3. **Credits** — `_billing` on responses; see the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n---\n\n## Glossary (storage)\n\n| Term | Meaning |\n|------|--------|\n| **BYOS** | **Bring Your Own Storage** — customer-managed remote storage (SSH/SFTP) connected via **Storage Mounts** |\n| **Storage Mounts** | PaperOffice connector to external storage used by workspaces |\n\n---\n\n## VISITOR mode (no user Bearer)\n\nWithout a user Bearer header, the API uses **VISITOR auto-tier** per IP (rate-limited). Allowed: `/docs/*`, `GET /health`, `GET /ping`, public compliance verify. **Product APIs and job pipelines require `po_sk_` / `po_ut_` / `po_pk_`.**\n\n---\n\n## Related folders\n\n| Need | Open |\n|------|------|\n| Image / voice / translate | **🎨 Media AI** |\n| OCR / IDP | **📄 Document AI** |\n\n---\n\n*Documentation release: `R20260721.1103` · Regenerate via `GET https://api.paperoffice.ai/latest/docs/postman`*\n","item":[{"name":"🧭 Quickstart Tutorial","description":"Run **① → ④** in order (about 2 minutes).\n\n- **①** `GET /docs/llms.txt` — public docs (no Bearer). From **②** set `{{bearer_token}}` (see **Guides → Authentication**).\n- **③** submits a demo invoice (`{{pipeline}}` = AI-OCR).\n- **④** returns your **JSON result** — **you are done** for the Quickstart.\n- Step **③** auto-fills `{{job_id}}` when you click **Send**.\n\nNeed a **file download** later? See **Guides → Optional: Download result file** (not step ⑤).","item":[{"name":"① Fetch public API index (llms.txt)","request":{"method":"GET","auth":{"type":"noauth"},"header":[{"key":"Accept","value":"text/plain"}],"url":{"raw":"{{base_url}}/docs/llms.txt","host":["{{base_url}}"],"path":["docs","llms.txt"]},"description":"## Quickstart step ①\n\nPublic documentation index — **no Bearer token** required (VISITOR auto-tier on `/docs/*` only).\n\nFrom step **②** set `{{bearer_token}}` before `GET /job/pricelist` and job pipelines."},"response":[]},{"name":"② Get pricelist","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/job/pricelist","host":["{{base_url}}"],"path":["job","pricelist"]},"description":"## Overview\nReturns all available job pipelines with credit costs and billing units. Keys are pipeline names (e.g. `paperoffice_aiocr___generate`, `paperoffice_imagestudio___generate`, `paperoffice_voice___tts`). Image Studio uses one pipeline with a `model` parameter (`basic`, `premium`, `ultra`) — not separate pipeline suffixes.\n\n## Request parameters\n## Best practices\n- No document `pofid` — use `job_id`, `download_token`, or pipeline names from the parameter table and prior submit responses.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-jobs-get-pricelist` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"③ Submit your first job","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/{{pipeline}}","host":["{{base_url}}"],"path":["job","add","{{pipeline}}"],"variable":[{"key":"pipeline","value":"","description":"Pipeline slug from GET /job/pricelist (e.g. pdfstudio___compress_pdf)."}]},"body":{"mode":"formdata","formdata":[{"key":"priority","value":"100","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer"},{"key":"client_wait","value":"{{client_wait}}","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","disabled":true},{"key":"source_url","value":"{{base_url}}/download/demo/demo_invoice.pdf","type":"text","description":"Public demo PDF (uses your Bearer token on protected hosts). Alternative: multipart field `file` with a local PDF/image."},{"key":"file","value":"","type":"file","description":"Optional: upload a local PDF or image instead of source_url.","disabled":true},{"key":"async_only","value":"false","type":"text","description":"Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","disabled":true}]},"description":"# Submit Your First Job\n\nThis is the core request pattern for all PaperOffice AI processing.\n\n## How it works\n\n1. Leave `client_wait=true` (default) for **inline results** on the same HTTP connection (dynamic hold; see `max_wait_seconds` on HTTP 202)\n2. Provide a document via `source_url` (preset demo PDF) **or** multipart field `file`\n3. Use **form-data** body only — do not set `Content-Type: application/json` on this request\n4. The `{{pipeline}}` variable determines what processing to run\n\n## Common Pipelines\n\n**Important:** pipeline names use triple underscores (`___`), not dots (`.`).\n\n| Pipeline | What it does |\n|----------|-------------|\n| `paperoffice_aiocr___generate` | AI-OCR / IDP: extract text & fields from images/PDFs |\n| `paperoffice_imagestudio___generate` | AI image generation (text-to-image) |\n| `paperoffice_imagestudio___remove_bg` | Remove background from an image |\n| `paperoffice_voice___tts` | Text-to-Speech (voice generation) |\n| `paperoffice_voice___stt` | Speech-to-Text (transcription) |\n\n**Note:** Some Document AI endpoints use the URL path `/job/add/workflow` with **fixed template parameters** — open the named endpoint in Document AI (e.g. Extract invoice), not a free pipeline name.\n\n## Inline wait vs. poll\n\n- **Default (`client_wait=true`)**: Result in the same response when ready (or HTTP 202 + `poll_url` + `max_wait_seconds` when hold is exceeded)\n- **`client_wait=false` or `async_only=true`**: Immediate `job_id` — poll with step **④**\n- **`priority`**: Higher = faster queue + more credits; omit = plan default. Separate from the about 5 min connection hold.\n\n**Quickstart ends at step ④** — your JSON result is there. File download is optional (see **Guides**).\n\nSet the `{{pipeline}}` collection variable to the pipeline you want to test, then hit **Send**."},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["try {","    const body = pm.response.json();","    const pickJobId = (obj) => {","        if (!obj || typeof obj !== \"object\") return null;","        if (typeof obj.job_id === \"string\" && obj.job_id.length > 0) return obj.job_id;","        if (obj.data && typeof obj.data.job_id === \"string\") return obj.data.job_id;","        if (obj.job_result && typeof obj.job_result.job_id === \"string\") return obj.job_result.job_id;","        return null;","    };","    const jobId = pickJobId(body);","    if (jobId) {","        pm.collectionVariables.set(\"job_id\", jobId);","        console.log(\"Quickstart: job_id →\", jobId);","    }","    const poll = body.poll_url || body.poll_endpoint || (body.data && body.data.poll_url);","    if (typeof poll === \"string\" && poll.length > 0) {","        pm.collectionVariables.set(\"poll_url\", poll);","    }","} catch (e) {","    console.warn(\"Quickstart ③ job_id capture:\", e.message);","}"]}}]},{"name":"④ Get job status and result — finish here","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/job/get/{{job_id}}?compact=true","host":["{{base_url}}"],"path":["job","get","{{job_id}}"],"query":[{"key":"compact","value":"true","description":"When true (default), omit large OCR/preview blobs from job_result. Set false for full job output. | Type: boolean","disabled":false}],"variable":[{"key":"job_id","value":"00000000-0000-0000-0000-000000000001","description":"Job ID from POST /job/add/{pipeline} or async submit (poll with GET /job/get/{job_id})."}]},"description":"Use after async submissions (**HTTP 202**, connection hold timeout, or `client_wait=false`). Returns envelope `status: \"success\"` on HTTP 200 and **`job_status`** (`pending`, `processing`, `completed`, `failed`), progress metadata, and **`job_result`** when finished.\n\n**Polling:** every **5–10 seconds** until `job_status` is `completed` or `failed`. Top-level `status` is the response envelope — not the job state.\n\n**Query `compact`:** default `true` — omits large OCR/preview blobs from `job_result`. Set `compact=false` for full output.\n\n## Best practices\n- No document `pofid` — use `job_id`, `download_token`, or pipeline names from the parameter table and prior submit responses.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-jobs-get-job-status-result` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)\n---\n\n## Quickstart: you finish here (step ④)\n\nThis step returns your **job result as JSON** (`job_status`, `job_result`).\n\n- Use **`{{job_id}}`** from step **③** in the path: `GET /job/get/{{job_id}}` (not as a query parameter).\n- Poll every **5–10 seconds** after HTTP **202** until `job_status` is `completed` or `failed`.\n- **You do not need a `download_token` for the default demo** — extracted invoice data is inside `job_result`.\n\n**Optional file download:** only if `job_result` contains a URL with `/job/download/…` → see **Guides → Optional: Download result file**."},"response":[]}]},{"name":"📖 Guides","description":"Markdown reference — open each item's **Documentation** tab. Start with **Documentation release** and **LLM-first integration** before coding.","item":[{"name":"📌 Documentation release (read me)","request":{"method":"GET","auth":{"type":"noauth"},"header":[{"key":"X-PO-DOC-ONLY","value":"1","description":"Marker for documentation-only Postman items (not an API header).","disabled":true}],"url":{"raw":"{{base_url}}/docs/llms.txt#quick-start","host":["{{base_url}}"],"path":["docs","llms.txt"]},"description":"> **Documentation only** — do not use **Send**. This item explains API behavior; it does not invoke a product endpoint.\n\n## Documentation release\n\n**Active API documentation release:** `R20260721.1103`\n\nThis ID is generated when the live Postman collection is built (`GET https://api.paperoffice.ai/latest/docs/postman`). Compare it with the documentation release shown in the site footer on [paperoffice.ai](https://paperoffice.ai). If they differ, **re-download** the collection or point your AI at fresh **llms.txt** exports.\n\nCurated requests may end with a footer line: `Documentation release: R20260721.1103`.\n\nCollection variable: `{{documentation_release_id}}` (set when you import a fresh export)."},"response":[]},{"name":"🤖 LLM-first integration (recommended for coding) (read me)","request":{"method":"GET","auth":{"type":"noauth"},"header":[{"key":"X-PO-DOC-ONLY","value":"1","description":"Marker for documentation-only Postman items (not an API header).","disabled":true}],"url":{"raw":"{{base_url}}/docs/llms.txt#quick-start","host":["{{base_url}}"],"path":["docs","llms.txt"]},"description":"> **Documentation only** — do not use **Send**. This item explains API behavior; it does not invoke a product endpoint.\n\n# LLM-first integration (recommended for coding)\n\nPaperOffice is designed **LLM-first**: the model reads structured docs and chooses tools — not the other way around. **Do not paste this entire Postman JSON (about 586 KB) into a chat context.**\n\n---\n\n## Choose the right surface\n\n| Priority | Surface | URL | Best for |\n|----------|---------|-----|----------|\n| **1 — Coding** | **llms-full.txt** | `https://api.paperoffice.ai/latest/docs/llms-full.txt` | Cursor, Claude Code, Windsurf, ChatGPT — full spec in one crawlable file |\n| **2 — Index** | **llms.txt** | `https://api.paperoffice.ai/latest/docs/llms.txt` | Smaller hub (llmstxt.org); link discovery before deep work |\n| **3 — Tools** | **MCP server** | `https://mcp.paperoffice.ai/mcp` | Native `tools/list` + `tools/call` in MCP clients |\n| **4 — Humans** | **Postman JSON** | `https://api.paperoffice.ai/latest/docs/postman` | Manual Send, QA, demos, Insomnia/Bruno |\n\nURLs in this guide are resolved for copy-paste. HTTP requests in the collection use the Postman variable **`{{base_url}}`** (default set on import).\n\n---\n\n## Example prompts (copy-paste)\n\n### Full implementation (recommended)\n\n```\nRead the PaperOffice API spec:\nhttps://api.paperoffice.ai/latest/docs/llms-full.txt\n\nDocumentation release: R20260721.1103\n\nImplement a Python function that uploads a PDF, runs AI-OCR, and returns extracted text using the job API (connection hold + poll).\n```\n\n### Hub-only (smaller context)\n\n```\nRead https://api.paperoffice.ai/latest/docs/llms.txt then fetch only the sections needed for Voice TTS.\nRelease: R20260721.1103\n```\n\n### MCP (Cursor / Claude Desktop)\n\nConfigure MCP at `https://mcp.paperoffice.ai/mcp` with `Authorization: Bearer YOUR_TOKEN`, then ask naturally: *\"List TTS voices and synthesize this script.\"*\n\n---\n\n## Why llms.txt beats Postman for agents\n\n| | llms-full.txt | Postman collection |\n|---|---------------|-------------------|\n| Size | about 527 KB | about 586 KB |\n| Format | Plain text, llmstxt.org | JSON + UI metadata |\n| Tool routing | Model reads endpoints & params | Human clicks requests |\n| Release | Regenerated with API deploy | Export timestamp in overview |\n\n---\n\n## Related\n\n- **Developer landing:** https://paperoffice.ai/l/developer-llms/ (language auto) · English: https://paperoffice.ai/en/developer/llms/\n\n- **Quickstart (executable):** Introduction → Quickstart Tutorial **①–④** (submit → poll — **you are done at ④**)\n- **Optional file download:** Introduction → Guides → **Optional: Download result file**\n- **Auth & jobs:** Introduction → Guides"},"response":[]},{"name":"📥 Optional: Download result file (read me)","request":{"method":"GET","auth":{"type":"noauth"},"header":[{"key":"X-PO-DOC-ONLY","value":"1","description":"Marker for documentation-only Postman items (not an API header).","disabled":true}],"url":{"raw":"{{base_url}}/docs/llms.txt#job-workflow-hybrid-client-wait","host":["{{base_url}}"],"path":["docs","llms.txt"]},"description":"> **Documentation only** — do not use **Send**. This item explains API behavior; it does not invoke a product endpoint.\n\n# Optional: Download result file (not part of Quickstart)\n\nThe **Quickstart ends at step ④** — your **JSON result** is in `GET /job/get/{{job_id}}`.\n\nUse this section **only** when you need the **binary file** (PDF, image, audio), not the structured JSON.\n\n---\n\n## When do I need this?\n\n| Pipeline / output | Need download? |\n|-------------------|------------------|\n| **Quickstart demo** (AI-OCR on `demo_invoice.pdf`) | Usually **no** — fields and text are in `job_result` at step ④ |\n| TTS, generated images, searchable PDF | Often **yes** — step ④ returns a **URL** like `…/job/download/…` |\n\n---\n\n## How to get the download ID\n\n1. Run **Quickstart ④** until `job_status` is `completed`.\n2. In the JSON, search for a string containing **`/job/download/`** (e.g. `searchable_pdf_path`, `download_url`, `image_urls`).\n3. **`download_token`** = the **last path segment** of that URL (long opaque string).  \n   There is **no** separate JSON field named `download_token`.\n4. Call **`GET {{base_url}}/job/download/{{download_token}}`** (path only — no query parameter).\n\n**Easier:** open the **full URL** from `job_result` in a browser or HTTP client (same Bearer token).\n\n---\n\n## Request below\n\nThe executable request **Download result file** uses `{{download_token}}`. Set it manually from step ④, or from the URL segment as described above."},"response":[]},{"name":"GET Download result file (optional — use Guides doc first)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/job/download/{{download_token}}","host":["{{base_url}}"],"path":["job","download","{{download_token}}"],"variable":[{"key":"download_token","value":"","description":"Path parameter `download_token` — see the parameter table in the endpoint description."}]},"description":"## Overview\nDownload a **result file** (PDF, image, audio, document) when the job output is a binary, not only JSON.\n\n**Not part of the Quickstart.** For the default OCR demo, step **④ Get job status and result** already contains the extracted data in `job_result`.\n\n---\n\n## When to use\nthis endpoint\n\n| Situation | Action |\n|-----------|--------|\n| Quickstart ③ → ④ completed | **Stop at ④** unless you see a `/job/download/…` URL in `job_result` |\n| `job_result` contains `…/job/download/ABC…` | Use **`ABC…`** as `{{download_token}}` in the path below |\n| You have the full download URL | Open that URL directly (Bearer token) — this request is optional |\n\nThere is **no** JSON field named `download_token`. Copy the ID from the **last segment** of a download URL in `job_result`, or open the full URL.\n\n---\n\n## Request\n\n`GET {{base_url}}/job/download/{{download_token}}` — **path only**. Do not add `download_token` as a query parameter.\n\nSupported types: PNG, JPG, WebP, PDF, MP3, WAV, DOCX, XLSX (`Content-Type` in the response).\n\n---\n\n## Quickstart path\n\n1. **③** Submit job → **`job_id`** is set automatically  \n2. **④** Poll until `job_status` is `completed` → read **`job_result`** (main outcome)  \n3. **This request** — only if you need the file bytes from a download URL in ④"},"response":[]},{"name":"📘 Authentication Guide (read me)","request":{"method":"GET","auth":{"type":"noauth"},"header":[{"key":"X-PO-DOC-ONLY","value":"1","description":"Marker for documentation-only Postman items (not an API header).","disabled":true}],"url":{"raw":"{{base_url}}/docs/llms.txt#authentication","host":["{{base_url}}"],"path":["docs","llms.txt"]},"description":"> **Documentation only** — do not use **Send**. This item explains API behavior; it does not invoke a product endpoint.\n\n# Authentication Guide\n\n**A Bearer token is mandatory** for all job/processing endpoints (Image, OCR, LLM, Voice, PDF, IDP, Translate text, …).\n\n---\n\n## Header\n\n```http\nAuthorization: Bearer YOUR_TOKEN\n```\n\nSet the collection variable `{{bearer_token}}` once — all curated requests inherit it.\n\n---\n\n## HTTP methods (PaperOffice convention)\n\nPaperOffice is **not** a strict REST CRUD API. Most mutations use **`POST`** with action-style paths (`template-delete`, `import-delete`, tag/note/comment removal, …).\n\n| Pattern | Example |\n|---------|---------|\n| **One `DELETE`** | `DELETE /documents/document-delete` — permanent document removal |\n| **Everything else** | `POST` (or `GET` for reads) — including other delete operations |\n\nDo **not** assume `DELETE /resource/{id}` works for DMS entities — check the documented method per endpoint.\n\n---\n\n## Token types\n\n| Prefix | Type | Use case | Browser-safe? |\n|--------|------|----------|---------------|\n| `po_sk_` | **Secret key** | Server-to-server, full API access | No — never expose in frontends |\n| `po_ut_` | **User token** | User-scoped; permissions depend on licence tier | No |\n| `po_pk_` | **Publishable key** | Browser / Claude Artifacts / ChatGPT Canvas | **Yes** — scoped, budget-capped, origin-locked |\n\n### Publishable keys (`po_pk_`)\n\nPublishable keys (`po_pk_`) enable browser-direct API calls with scoped budgets and origin locks. **Create, list, rotate, and revoke** keys in the PaperOffice app under **Account → API** (not via this public Postman export).\n\nSafeguards: no `DELETE` on unrelated resources, admin/billing blocked, matching `Origin` required, lifetime credit budget, per-minute rate limit. Full server-side Bearer tokens remain required for job pipelines and admin APIs.\n\n---\n\n## VISITOR mode (no user Bearer header)\n\nIf you send **no** `Authorization` header (or leave `{{bearer_token}}` empty), the API assigns a **VISITOR** tier token (`poapi-…`) per IP automatically — rate-limited, minimal credits.\n\n| Allowed on VISITOR (examples) | Not on VISITOR |\n|-------------------------------|----------------|\n| `/docs/*` (Postman, llms, MCP markdown) | Job pipelines (OCR, IDP, …) |\n| `GET /health`, `GET /ping` (connectivity; no credits without user Bearer) | `/ip2location/*`, `/currency_exchange/*`, `/geocoding/*`, `/weather` |\n| Public compliance verify | Admin / billing / `GET /job/get` (API token required) |\n\nFor production workloads use `po_sk_`, `po_ut_`, or `po_pk_`.\n\n---\n\n## Common auth errors\n\n| HTTP | Code | Action |\n|------|------|--------|\n| 401 | `AUTH_REQUIRED` | Add Bearer header |\n| 401 | `INVALID_TOKEN` | Check prefix and copy-paste |\n| 401 | `BEARERTOKEN_EXPIRED` | Rotate token in PaperOffice app |\n\nSee **Reference → Errors & Status Codes** for the full matrix."},"response":[]},{"name":"⚡ Priority, Jobs & Connection Hold (read me)","request":{"method":"GET","auth":{"type":"noauth"},"header":[{"key":"X-PO-DOC-ONLY","value":"1","description":"Marker for documentation-only Postman items (not an API header).","disabled":true}],"url":{"raw":"{{base_url}}/docs/llms.txt#priority-jobs","host":["{{base_url}}"],"path":["docs","llms.txt"]},"description":"> **Documentation only** — do not use **Send**. This item explains API behavior; it does not invoke a product endpoint.\n\n# Priority, Jobs & Connection Hold\n\nMost AI features run as **jobs**. This guide explains queue **priority**, the **connection hold**, and polling — the same model used across Document AI and Media AI job pipelines.\n\n---\n\n## ⚡ Queue priority (billing & speed)\n\nThe `priority` parameter affects **how soon your job starts in the queue** and **how many credits** the job costs.\n\n| Priority | Typical wait until **job start** (non-binding) | Credit multiplier |\n|----------|-----------------------------------------------|------------------|\n| **900** | Synchronous / stream (holds this HTTP connection; not a queue tier above 899) | Highest |\n| **700–899** | 1–10 min | High |\n| **500–699** | 10–30 min | Mid |\n| **100–499** | 2–48 h | Lower cost |\n| **0–99** | best-effort / varies | Batch / background |\n\n**Omit `priority`** to use your subscription **plan default** (tier from bearer token).\n\n**Higher priority = faster queue start + higher credit cost** — see `GET /job/pricelist` for tier multipliers.\n\n**⏱ Job duration** depends on payload (e.g. IDP, long TTS text) — separate from queue start and from the HTTP connection hold below.\n\n---\n\n## 🔄 Connection hold & polling (about 5 minute HTTP limit)\n\n### Default — hold this HTTP request (`client_wait=true`, omit parameter)\n\n```\nPOST /job/add/{pipeline}  →  hold connection up to about 5 min (about 295s)  →  200 result OR 202 + poll_url\n```\n\n### After HTTP 202 (connection hold timeout)\n\nThe job **keeps running**. Poll `GET /job/get/{job_id}` (or use `poll_url` from the response) every **5–10 seconds** until `job_status` is `completed` or `failed`.\n\n### Immediate `job_id` (`client_wait=false` or `async_only=true`)\n\n```\n1. POST /job/add/{pipeline}      →  job_id immediately\n2. GET  /job/get/{job_id}         →  poll every 5–10s until `job_status` is `completed` — **JSON result is here**\n3. (Optional) GET /job/download/{token} — **only** when `job_result` contains a `/job/download/…` URL (TTS, PDF file, images). See **Guides → Optional: Download result file**.\n```\n\n### `job_status` values (poll field on `GET /job/get`)\n\nTop-level `status` is the response envelope (`\"success\"` on HTTP 200) — **not** the job state.\n\n| `job_status` | Meaning |\n|--------|---------|\n| `processing` | Job is still running — keep polling |\n| `completed` | Done — result contains data or download URL |\n| `failed` | Error — check error details in response |\n\n## Job ID\n\nEach async job returns an **opaque `job_id`**. Use it with `GET /job/get/{job_id}` until `job_status` is `completed` or `failed`.\n\n## Credits\n\n- Credits are deducted at **job creation**, not at download.\n- Download tokens are **temporary** — fetch results promptly after `job_status` is `completed`.\n- Inspect `_billing.job` on responses for `credits_billed`, priority tier, and SLA labels.\n\n## Executable walkthrough\n\nRun **Quickstart Tutorial** steps ①–④ in order — public docs check, then pricelist/submit/poll (Bearer from step ②)."},"response":[]},{"name":"📄 Document IDs (POFID) (read me)","request":{"method":"GET","auth":{"type":"noauth"},"header":[{"key":"X-PO-DOC-ONLY","value":"1","description":"Marker for documentation-only Postman items (not an API header).","disabled":true}],"url":{"raw":"{{base_url}}/docs/llms.txt#document-ids-pofid","host":["{{base_url}}"],"path":["docs","llms.txt"]},"description":"> **Documentation only** — do not use **Send**. This item explains API behavior; it does not invoke a product endpoint.\n\n# Document IDs (POFID)\n\nPaperOffice documents are addressed by a **POFID** — a stable hash-based file identifier (not a small numeric database ID).\n\n---\n\n## Format\n\n- Example: `example-pofid.pdf` (public docs use this placeholder)\n- Live values are opaque hash-based identifiers — store and pass back exactly as returned from upload, search, or get endpoints\n- Returned in `pofid` fields from upload, search, and get endpoints\n\n---\n\n## Rules\n\n| Do | Don't |\n|----|-------|\n| Use `pofid` from `po_documents_search` / `po_documents_get` | Pass numeric `document_id` like `50` or `123` to POFID-only endpoints |\n| Store the full string | Truncate or guess IDs |\n\n---\n\n## Related\n\n- **Document AI → Headless DMS** — upload and list\n- **AI Document Operations** — analysis endpoints keyed by `document_id` (POFID)"},"response":[]},{"name":"🔀 Pipeline routing (read me)","request":{"method":"GET","auth":{"type":"noauth"},"header":[{"key":"X-PO-DOC-ONLY","value":"1","description":"Marker for documentation-only Postman items (not an API header).","disabled":true}],"url":{"raw":"{{base_url}}/docs/llms.txt#pipeline-routing","host":["{{base_url}}"],"path":["docs","llms.txt"]},"description":"> **Documentation only** — do not use **Send**. This item explains API behavior; it does not invoke a product endpoint.\n\n# Pipeline routing (workflow vs aiocr)\n\nPaperOffice exposes multiple job pipelines under `POST /job/add/{pipeline}`. Choose the pipeline that matches the integration step.\n\n---\n\n## Common pipelines\n\n| Pipeline slug | Use when |\n|---------------|----------|\n| `aiocr` | OCR / text extraction from scans or PDFs |\n| `aiidp` | Structured field extraction (invoices, forms) |\n| `workflow` | Multi-step automation templates (orchestration) |\n| `translate`, `tts`, `image`, … | See product folders |\n\n---\n\n## Decision guide\n\n1. **Single document OCR** → `aiocr` (Document AI)\n2. **Invoice fields / IDP** → `aiidp` (Document AI)\n3. **Configured automation** → `workflow` (Workflow AI) — requires a template ID\n4. **Poll** → `GET /job/get/{job_id}` after submit or HTTP 202\n\nSee **Quickstart Tutorial** step ③ for a working `{{pipeline}}` example."},"response":[]}]},{"name":"🔌 Integration & Discovery","description":"Connectivity probes (`GET /health`, `GET /ping`), MCP URLs, collection export, and LLM-readable specs.","item":[{"name":"Connectivity health (JSON)","request":{"method":"GET","auth":{"type":"noauth"},"header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/health","host":["{{base_url}}"],"path":["health"]},"description":"## Overview\nStructured API worker health check. Returns JSON with `success: true` and a short status message when the worker is operational.\n\n**Authentication:** Callable without Bearer (no credits). Optional Bearer is accepted; invalid tokens return HTTP **401** `TOKEN_NOT_FOUND`.\n\n**Contrast:** `GET /ping` returns plain text `PONG` for dumb load-balancer probes — use `/health` when your monitor needs JSON."},"response":[]},{"name":"Connectivity ping (plain text)","request":{"method":"GET","auth":{"type":"noauth"},"header":[],"url":{"raw":"{{base_url}}/ping","host":["{{base_url}}"],"path":["ping"]},"description":"## Overview\nMinimal load-balancer / connectivity probe. Returns **plain text** `PONG` (not JSON).\n\n**Authentication:** Callable without Bearer (no credits). If you send a PaperOffice API Bearer (`po_sk_`, `po_ut_`, `po_pk_`, …) it **must** be valid — unknown or revoked tokens return HTTP **401** `TOKEN_NOT_FOUND`.\n\n**Contrast:** `GET /health` returns JSON with `status` and service metadata — use `/health` for structured monitoring and `/ping` for dumb TCP/LB checks."},"response":[]},{"name":"⑥ Get MCP server integration info","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/docs/markdown","host":["{{base_url}}"],"path":["docs","markdown"]},"description":"# MCP server integration (PaperOffice API)\n\nReturns MCP server integration guidance for AI clients — authentication, profiles, tool discovery, and Document AI patterns.\n\n**Recommended endpoint (DocuWare-style DMS):** `https://mcp.paperoffice.ai/dms` (about 159 tools: CRUD + capture + workflow + signatures + schema). `/claude` is an alias.\n\n**Lighter module:** `/mcp-document-ai` (about 117 tools: read + CRUD + capture + comments/notes).\n\n**Other profiles:** `/mcp-workflow-ai` (workflow), `/mcp-document-workflow-ai` (combined), `/mcp` (37 read-only default), `/mcp-full` (all MCP tools). Legacy: `/mcp-headless`, `/mcp-headless-plus`.\n\n**Auth:** Same Bearer token as REST (`po_sk_`, `po_ut_`). Streamable HTTP MCP (JSON-RPC 2.0).\n\n**Aliases:** `po_documents_update_index` → document-edit; `po_job_get` → job poll; see llms-full.txt MCP section.\n\n**Voice clone (MCP):** `po_tts_voice_clone` — upload sample via `voice_sample_base64`, set `reference_text` (transcript) and `quality` (`premium` or `ultra`). Same REST pipeline as Postman **Clone voice (TTS)**.\n\n**Usage:** `GET {{base_url}}/docs/markdown` or llms-full.txt — 0 credits with user Bearer or VISITOR tier.\n\n**Usage:** `GET https://api.paperoffice.ai/latest/docs/markdown` — **0 credits** when authenticated via your API key **or** VISITOR auto-tier (no Bearer header → rate-limited `poapi-` token per IP).\n\n---\n\n## Quick setup (Cursor / Claude Desktop)\n\n1. Open MCP settings in your client.\n2. **DMS (canonical):** `https://mcp.paperoffice.ai/dms` (about 159 tools — full headless DMS).\n3. **Claude:** `https://mcp.paperoffice.ai/claude` (alias of `/dms`, same 159 tools).\n4. **Cursor:** `https://mcp.paperoffice.ai/cursor` (37 tools, read-safe while coding).\n5. **ChatGPT:** `https://mcp.paperoffice.ai/openai` (about 137 tools, Document + Workflow).\n6. Set header: `Authorization: Bearer YOUR_TOKEN` (`po_sk_`, `po_ut_`, or `po_pk_`).\n7. Without a token, REST calls to this API use **VISITOR** mode automatically (strict quotas).\n\n---\n\n## Related documentation\n\n| Resource | URL |\n|----------|-----|\n| Full LLM spec | `https://api.paperoffice.ai/latest/docs/llms-full.txt` |\n| LLM index | `https://api.paperoffice.ai/latest/docs/llms.txt` |\n| Postman collection | `https://api.paperoffice.ai/latest/docs/postman` |\n| Developer landing | https://paperoffice.ai/l/developer-llms/ |\n\n---\n**API reference:** `po-documentation-mcp-server-ai-integration` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** Free (included — documentation export; user Bearer or VISITOR auto-tier, 0 credits)","auth":{"type":"noauth"}},"response":[]},{"name":"⑦ Get Postman collection","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/docs/postman","host":["{{base_url}}"],"path":["docs","postman"]},"description":"## Overview\nReturns the live Postman collection JSON. Re-import when the footer release ID changes.\n\n**Usage:** `GET {{base_url}}/docs/postman` — same URL as this documentation item (live import link).\n\n**Note:** User Bearer or VISITOR auto-tier (no `Authorization` header → rate-limited `poapi-` token per IP). **0 credits** (documentation export).\n\n---\n**API reference:** `po-documentation-postman-collection` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** Free (included — documentation export; user Bearer or VISITOR auto-tier, 0 credits)","auth":{"type":"noauth"}},"response":[]},{"name":"📎 LLM URLs quick reference (read me)","request":{"method":"GET","auth":{"type":"noauth"},"header":[{"key":"X-PO-DOC-ONLY","value":"1","description":"Marker for documentation-only Postman items (not an API header).","disabled":true}],"url":{"raw":"{{base_url}}/docs/llms.txt#quick-start","host":["{{base_url}}"],"path":["docs","llms.txt"]},"description":"> **Documentation only** — do not use **Send**. This item explains API behavior; it does not invoke a product endpoint.\n\n# LLM-first integration (recommended for coding)\n\nPaperOffice is designed **LLM-first**: the model reads structured docs and chooses tools — not the other way around. **Do not paste this entire Postman JSON (about 586 KB) into a chat context.**\n\n---\n\n## Choose the right surface\n\n| Priority | Surface | URL | Best for |\n|----------|---------|-----|----------|\n| **1 — Coding** | **llms-full.txt** | `https://api.paperoffice.ai/latest/docs/llms-full.txt` | Cursor, Claude Code, Windsurf, ChatGPT — full spec in one crawlable file |\n| **2 — Index** | **llms.txt** | `https://api.paperoffice.ai/latest/docs/llms.txt` | Smaller hub (llmstxt.org); link discovery before deep work |\n| **3 — Tools** | **MCP server** | `https://mcp.paperoffice.ai/mcp` | Native `tools/list` + `tools/call` in MCP clients |\n| **4 — Humans** | **Postman JSON** | `https://api.paperoffice.ai/latest/docs/postman` | Manual Send, QA, demos, Insomnia/Bruno |\n\nURLs in this guide are resolved for copy-paste. HTTP requests in the collection use the Postman variable **`{{base_url}}`** (default set on import).\n\n---\n\n## Example prompts (copy-paste)\n\n### Full implementation (recommended)\n\n```\nRead the PaperOffice API spec:\nhttps://api.paperoffice.ai/latest/docs/llms-full.txt\n\nDocumentation release: R20260721.1103\n\nImplement a Python function that uploads a PDF, runs AI-OCR, and returns extracted text using the job API (connection hold + poll).\n```\n\n### Hub-only (smaller context)\n\n```\nRead https://api.paperoffice.ai/latest/docs/llms.txt then fetch only the sections needed for Voice TTS.\nRelease: R20260721.1103\n```\n\n### MCP (Cursor / Claude Desktop)\n\nConfigure MCP at `https://mcp.paperoffice.ai/mcp` with `Authorization: Bearer YOUR_TOKEN`, then ask naturally: *\"List TTS voices and synthesize this script.\"*\n\n---\n\n## Why llms.txt beats Postman for agents\n\n| | llms-full.txt | Postman collection |\n|---|---------------|-------------------|\n| Size | about 527 KB | about 586 KB |\n| Format | Plain text, llmstxt.org | JSON + UI metadata |\n| Tool routing | Model reads endpoints & params | Human clicks requests |\n| Release | Regenerated with API deploy | Export timestamp in overview |\n\n---\n\n## Related\n\n- **Developer landing:** https://paperoffice.ai/l/developer-llms/ (language auto) · English: https://paperoffice.ai/en/developer/llms/\n\n- **Quickstart (executable):** Introduction → Quickstart Tutorial **①–④** (submit → poll — **you are done at ④**)\n- **Optional file download:** Introduction → Guides → **Optional: Download result file**\n- **Auth & jobs:** Introduction → Guides"},"response":[]}]},{"name":"📚 Reference","description":"Global error matrix — success examples on product endpoints omit 401/402/429 by design.","item":[{"name":"⚠️ Errors & Status Codes","description":"# Errors & Status Codes\n\nAll PaperOffice API endpoints share **consistent error JSON**. Per-endpoint Postman items show **success (2xx) examples only** — errors are documented here once (Stripe/Twilio pattern).\n\n---\n\n## Error response shape\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": 401,\n    \"type\": \"authentication_error\",\n    \"message\": \"Invalid or expired bearer token.\"\n  }\n}\n```\n\nSome responses use `\"status\": \"error\"` with `\"code\": \"AUTH_REQUIRED\"` instead of the `success` / `error` object above — treat both shapes as errors.\n\n---\n\n## HTTP status codes\n\n| Code | Meaning | When |\n|------|---------|------|\n| `200` | OK | Success |\n| `201` | Created | Resource created |\n| `202` | Accepted | Connection hold timed out (about 295s) — job continues; use `poll_url` |\n| `400` | Bad Request | Invalid/missing parameters |\n| `401` | Unauthorized | Missing/invalid Bearer token |\n| `402` | Payment Required | Insufficient credits |\n| `403` | Forbidden | Permission or tier blocked |\n| `404` | Not Found | Unknown path or resource |\n| `429` | Too Many Requests | Rate or queue limit |\n| `500` | Server Error | Retry with backoff |\n| `503` | Unavailable | Backend down — retry |\n\n---\n\n## Common application codes\n\n| Code | HTTP | What to do |\n|------|------|------------|\n| `AUTH_REQUIRED` | 401 | Add `Authorization: Bearer` |\n| `TOKEN_NOT_FOUND` | 401 | Token revoked or unknown — create a new API key |\n| `INVALID_TOKEN` | 401 | Verify `po_sk_` / `po_ut_` / `po_pk_` |\n| `TIER_RESTRICTED` | 403 | No Bearer on product API — VISITOR tier blocked; use a paid token |\n| `UI_ONLY_ENDPOINT` | 403 | Operation only in PaperOffice web app (e.g. legal hold release) |\n| `BEARERTOKEN_EXPIRED` | 401 | Issue new token |\n| `INSUFFICIENT_CREDITS` | 402 | Top up or lower priority |\n| `JOB_REQUIRES_PAID_TIER` | 403 | Upgrade plan |\n| `RATE_LIMIT_EXCEEDED` | 429 | Backoff using `Retry-After` |\n| `QUEUE_LIMIT_REACHED` | 429 | Wait and resubmit job |\n| `INVALID_REQUEST` | 400 | Fix body/query per endpoint docs |\n| `INPUT_TOO_LARGE` | 400 | Split payload (e.g. translate 15k chars) |\n| `TRANSLATION_EMPTY` | 4xx/5xx | Retry or check source text |\n| `TRANSLATION_TIMEOUT` | 4xx/5xx | Poll job or increase priority |\n| `WORKSPACE_TYPE_REQUIRED` | 400 | Set `type` on workspace create (business type slug) |\n| `WORKSPACE_TIER_NOT_SHAREABLE` | 403 | Set workspace tier to `business` before external sharing (`standard` and `compliance` are not shareable) |\n| `CANNOT_SHARE_WITH_SELF` | 400 | Use a different recipient email/phone |\n| `NO_SHARE_CHANNEL` | 400 | Provide email and/or phone share channel |\n| `SHARE_CHANNEL_REQUIRED` | 400 | At least one share channel required |\n| `SHARE_RATE_LIMIT_HOUR` | 429 | Wait one hour between resend invitations |\n| `MOUNT_PURPOSE_REQUIRED` | 400 | Set `mount_purpose` to `byos` or `connector` |\n| `MOUNT_ID_REQUIRED` | 400 | Provide `mount_id` |\n| `CONFIRMATION_REQUIRED` | 400 | Set `confirm=true` for destructive actions |\n| `CLIENT_WAIT_REQUIRED` | 400 | Set `client_wait=true` when `output=inline` or `base64` |\n| `AGENT_ID_REQUIRED` | 400 | Provide `*_agent_id` (from app UI or MCP) |\n| `DOCUMENT_NOT_ANALYZED` | 409 | Run AI-DMS on the document first |\n| `NO_SUMMARY_EMBEDDING` | 404 | Document has no semantic embedding yet |\n| `SIGNED_DOCUMENT_NOT_AVAILABLE` | 404 | Signing not completed — download after all signers finish |\n| `SFTP_ERROR` / `FTP_ERROR` / `WEBDAV_ERROR` | 502 | Remote storage unreachable (not a PaperOffice 500) |\n| `SIGNING_TOKEN_REQUIRED` | 400 | Public signer endpoints use `?token=`, not Bearer |\n\nModule-specific catalogs (e.g. `GET /translate/languages` → `data.error_codes`) list **additional** codes for that surface.\n\n---\n\n## Rate limiting (429)\n\n| Header | Description |\n|--------|-------------|\n| `Retry-After` | Seconds until retry |\n| `X-RateLimit-Limit` | Max requests per window |\n| `X-RateLimit-Remaining` | Remaining in window |\n\n---\n\n## Credit system (402)\n\nEach billed call consumes credits. Inspect `_billing.job.credits_billed` (top-level alias `_billing.credits_billed` when present) and headers `X-Credits-Remaining`, `X-Credits-Monthly`, `X-Credits-Used-This-Request`.\n\n**Pricing:** [Calculator](https://app.paperoffice.ai/en/pricing/calculator) · `GET /billing/pricing/tiers`","item":[{"name":"Errors & status codes (read me)","request":{"method":"GET","auth":{"type":"noauth"},"header":[{"key":"X-PO-DOC-ONLY","value":"1","description":"Marker for documentation-only Postman items (not an API header).","disabled":true}],"url":{"raw":"{{base_url}}/docs/llms.txt#standard-error-codes","host":["{{base_url}}"],"path":["docs","llms.txt"]},"description":"> **Documentation only** — do not use **Send**. This item explains API behavior; it does not invoke a product endpoint.\n\n# Errors & Status Codes\n\nAll PaperOffice API endpoints share **consistent error JSON**. Per-endpoint Postman items show **success (2xx) examples only** — errors are documented here once (Stripe/Twilio pattern).\n\n---\n\n## Error response shape\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": 401,\n    \"type\": \"authentication_error\",\n    \"message\": \"Invalid or expired bearer token.\"\n  }\n}\n```\n\nSome responses use `\"status\": \"error\"` with `\"code\": \"AUTH_REQUIRED\"` instead of the `success` / `error` object above — treat both shapes as errors.\n\n---\n\n## HTTP status codes\n\n| Code | Meaning | When |\n|------|---------|------|\n| `200` | OK | Success |\n| `201` | Created | Resource created |\n| `202` | Accepted | Connection hold timed out (about 295s) — job continues; use `poll_url` |\n| `400` | Bad Request | Invalid/missing parameters |\n| `401` | Unauthorized | Missing/invalid Bearer token |\n| `402` | Payment Required | Insufficient credits |\n| `403` | Forbidden | Permission or tier blocked |\n| `404` | Not Found | Unknown path or resource |\n| `429` | Too Many Requests | Rate or queue limit |\n| `500` | Server Error | Retry with backoff |\n| `503` | Unavailable | Backend down — retry |\n\n---\n\n## Common application codes\n\n| Code | HTTP | What to do |\n|------|------|------------|\n| `AUTH_REQUIRED` | 401 | Add `Authorization: Bearer` |\n| `TOKEN_NOT_FOUND` | 401 | Token revoked or unknown — create a new API key |\n| `INVALID_TOKEN` | 401 | Verify `po_sk_` / `po_ut_` / `po_pk_` |\n| `TIER_RESTRICTED` | 403 | No Bearer on product API — VISITOR tier blocked; use a paid token |\n| `UI_ONLY_ENDPOINT` | 403 | Operation only in PaperOffice web app (e.g. legal hold release) |\n| `BEARERTOKEN_EXPIRED` | 401 | Issue new token |\n| `INSUFFICIENT_CREDITS` | 402 | Top up or lower priority |\n| `JOB_REQUIRES_PAID_TIER` | 403 | Upgrade plan |\n| `RATE_LIMIT_EXCEEDED` | 429 | Backoff using `Retry-After` |\n| `QUEUE_LIMIT_REACHED` | 429 | Wait and resubmit job |\n| `INVALID_REQUEST` | 400 | Fix body/query per endpoint docs |\n| `INPUT_TOO_LARGE` | 400 | Split payload (e.g. translate 15k chars) |\n| `TRANSLATION_EMPTY` | 4xx/5xx | Retry or check source text |\n| `TRANSLATION_TIMEOUT` | 4xx/5xx | Poll job or increase priority |\n| `WORKSPACE_TYPE_REQUIRED` | 400 | Set `type` on workspace create (business type slug) |\n| `WORKSPACE_TIER_NOT_SHAREABLE` | 403 | Set workspace tier to `business` before external sharing (`standard` and `compliance` are not shareable) |\n| `CANNOT_SHARE_WITH_SELF` | 400 | Use a different recipient email/phone |\n| `NO_SHARE_CHANNEL` | 400 | Provide email and/or phone share channel |\n| `SHARE_CHANNEL_REQUIRED` | 400 | At least one share channel required |\n| `SHARE_RATE_LIMIT_HOUR` | 429 | Wait one hour between resend invitations |\n| `MOUNT_PURPOSE_REQUIRED` | 400 | Set `mount_purpose` to `byos` or `connector` |\n| `MOUNT_ID_REQUIRED` | 400 | Provide `mount_id` |\n| `CONFIRMATION_REQUIRED` | 400 | Set `confirm=true` for destructive actions |\n| `CLIENT_WAIT_REQUIRED` | 400 | Set `client_wait=true` when `output=inline` or `base64` |\n| `AGENT_ID_REQUIRED` | 400 | Provide `*_agent_id` (from app UI or MCP) |\n| `DOCUMENT_NOT_ANALYZED` | 409 | Run AI-DMS on the document first |\n| `NO_SUMMARY_EMBEDDING` | 404 | Document has no semantic embedding yet |\n| `SIGNED_DOCUMENT_NOT_AVAILABLE` | 404 | Signing not completed — download after all signers finish |\n| `SFTP_ERROR` / `FTP_ERROR` / `WEBDAV_ERROR` | 502 | Remote storage unreachable (not a PaperOffice 500) |\n| `SIGNING_TOKEN_REQUIRED` | 400 | Public signer endpoints use `?token=`, not Bearer |\n\nModule-specific catalogs (e.g. `GET /translate/languages` → `data.error_codes`) list **additional** codes for that surface.\n\n---\n\n## Rate limiting (429)\n\n| Header | Description |\n|--------|-------------|\n| `Retry-After` | Seconds until retry |\n| `X-RateLimit-Limit` | Max requests per window |\n| `X-RateLimit-Remaining` | Remaining in window |\n\n---\n\n## Credit system (402)\n\nEach billed call consumes credits. Inspect `_billing.job.credits_billed` (top-level alias `_billing.credits_billed` when present) and headers `X-Credits-Remaining`, `X-Credits-Monthly`, `X-Credits-Used-This-Request`.\n\n**Pricing:** [Calculator](https://app.paperoffice.ai/en/pricing/calculator) · `GET /billing/pricing/tiers`"},"response":[]}]}]}]},{"name":"📊 Analytics AI","description":"# Analytics AI\n\n**Analytics AI** is the full **API-first business intelligence and knowledge-graph stack** over your document estate: workspace KPIs, financial summaries, meta-field analytics, user activity, and **Knowledge Graph** traversal (entities, relations, partners, multihop queries).\n\nThis section exposes the **complete public Analytics AI surface** — every canonical `GET /analytics/*` endpoint, all `GET|POST /knowledge_graph/*` tools, and document-intelligence graph APIs. **New integrations should use `/analytics/*` and `/knowledge_graph/*` only** (overview, trends, meta-fields-analysis, graphs, ask, multihop).\n\n---\n\n## Sub-modules\n\n| Sub-module | Folder | Primary use |\n|------------|--------|-------------|\n| **Analytics & BI** | Analytics & BI | Dashboards, trends, distribution, financial flow, meta-fields, activity |\n| **Knowledge Graph** | Knowledge Graph | Document/workspace graphs, entities, relations, ask, multihop, Mermaid export |\n\n---\n\n## Typical workflows\n\n1. **Operations dashboard:** Scheduled pull of `/analytics/overview` and `/analytics/trends` into your warehouse.\n2. **Quality loop:** Correlate IDP failure rates (Document AI) with `/analytics/meta-fields-analysis`.\n3. **Graph exploration:** From a document ID, call `/knowledge_graph/document` or entity endpoints; use **multihop** for cross-document insights.\n\n---\n\n## Prerequisites\n\n- Documents ingested via **Document AI → Headless DMS**\n- Extractions from **AI-IDP** where BI dimensions reference extracted fields\n- Bearer token with **Analytics AI** module access (granted on the account or sub-user)\n- **Sub-users:** pass explicit `workspace_id` on scoped analytics and universe graph calls\n\n---\n\n## Integration checklist\n\n| Step | Action |\n|------|--------|\n| 1 | Confirm documents are ingested via **Document AI → Headless DMS** |\n| 2 | Start with `GET /analytics/overview` and `GET /analytics/trends` for KPI baselines |\n| 3 | Use `GET /analytics/meta-fields-analysis` to see which extraction fields are populated |\n| 4 | Drill into **Knowledge Graph** for document/workspace graphs and cross-document ask |\n| 5 | Pass `workspace_id` on scoped calls when using sub-user tokens |\n\n---\n\n## Cross-links\n\n- **Document AI** — source documents and intelligence indexing\n- **`GET /job/pricelist`** — billing on billed analytics jobs where applicable\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"📊 Analytics & BI","description":"# Analytics & BI\n\n**Canonical REST surface:** `GET /analytics/*` (overview, trends, distribution, financial summaries, meta-field analysis, user activity).\n\nUse **`GET /analytics/overview`** for dashboard KPIs, **`GET /analytics/trends`** for time series, and **`GET /analytics/meta-fields-analysis`** for IDP field coverage — these are the supported REST paths in this collection.\n\n---\n\n## Usage\n\n- Parameterize by **date range** (`period`) and **`workspace_id`** where noted\n- **Sub-users** must pass a specific `workspace_id` on scoped analytics calls\n- Large reports may run as **jobs** — poll like other pipelines\n- Export results to your data warehouse via scheduled pulls\n\n---\n\n## Permissions\n\nMost analytics endpoints require the **Analytics AI** module on the bearer token (account administrator or granted module access). Workspace management endpoints (under Document AI) use separate admin-level permissions.\n---\n\n## Shared execution model (jobs)\n\n| Concept | Detail |\n|---------|--------|\n| **Bearer token** | Required for all processing endpoints |\n| **Connection hold** | Default `client_wait=true` — hold HTTP up to about 295 s, then **200** or **202** + `poll_url` |\n| **Polling** | `GET /job/get/{job_id}` after **202** or when work exceeds the hold |\n| **Queue priority** | Optional `priority` — omit for plan default; see **Introduction & Basics → Guides** |\n\nCredit amounts are **not** duplicated here — use **`GET /job/pricelist`** or `_billing` on responses.","item":[{"name":"Get activity heatmap","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/activity-heatmap?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["analytics","activity-heatmap"],"query":[{"key":"year","value":"","description":"Year (default: current year) | Type: number","disabled":true},{"key":"workspace_id","value":"{{workspace_id}}","description":"Limit to workspace | Type: number","disabled":true}]},"description":"## Overview\nActivity heatmap — daily upload/change intensity over a year (or selected window) for capacity planning. **Permissions:** Requires Analytics AI module access on the bearer token.\n**Scope:** Single PaperOffice account (tenant). Pass `workspace_id` for sub-users.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-analytics-heatmap-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get analytics overview","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/overview?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["analytics","overview"],"query":[{"key":"period","value":"","description":"Time period | Type: string | Allowed: 7d, 30d, 90d, 365d, all","disabled":true},{"key":"workspace_id","value":"{{workspace_id}}","description":"Limit to workspace | Type: number","disabled":true}]},"description":"Dashboard KPIs for the document estate — document counts, storage usage, DMS distribution, and high-level activity indicators. Use as the first call when building an operations dashboard. Combine with `GET /analytics/trends` for time series. **Permissions:** Requires Analytics AI module access on the bearer token.\n**Scope:** Single PaperOffice account (tenant). Pass `workspace_id` for sub-users.\n\nUse query parameters such as `workspace_id` and supported date filters.\n\n---\n**API reference:** `po-analytics-overview-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get audit center findings","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/audit-center?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["analytics","audit-center"],"query":[{"key":"limit","value":"","description":"Max results (1-500) | Type: number","disabled":true},{"key":"offset","value":"","description":"Pagination offset | Type: number","disabled":true},{"key":"severity","value":"","description":"Filter by severity | Type: string | Allowed: low, medium, high, critical","disabled":true},{"key":"require_review","value":"","description":"Only entries requiring review | Type: boolean","disabled":true},{"key":"workspace_id","value":"{{workspace_id}}","description":"Limit to workspace | Type: number","disabled":true}]},"description":"## Overview\nWorkflow audit center — compliance-oriented findings with severity (low/medium/high/critical) and review flags. Monitoring view for potential compliance issues (GDPR/GoBD-oriented signals) — not a legal certification. **Permissions:** Requires Analytics AI module access on the bearer token.\n**Scope:** Single PaperOffice account (tenant). Pass `workspace_id` for sub-users.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-analytics-audit-center-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get contact financial statistics","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/contact-stats-financial","host":["{{base_url}}"],"path":["analytics","contact-stats-financial"],"query":[{"key":"limit","value":"","description":"Max contacts to return (1-500). Should match contact-stats limit when merging client-side. | Type: number | Example: 50","disabled":true}]},"description":"## Overview\nFinancial statistics for business contacts (slow endpoint — typically 10–30 seconds).\n\nUse a client timeout of at least **35 seconds** and keep `limit` modest (e.g. `10`) on large estates.\n\n## Performance\nLarge accounts may need **10–30 seconds**. Use `limit` / `page` query parameters for interactive use (recommended: `limit=10`). This endpoint performs heavy aggregation and is not cached.\n\n---\n**API reference:** `po-analytics-contacts-financial-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get contact statistics","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/contact-stats","host":["{{base_url}}"],"path":["analytics","contact-stats"],"query":[{"key":"limit","value":"","description":"Max results (1-500) | Type: number","disabled":true},{"key":"period","value":"","description":"Time period | Type: string | Allowed: 7d, 30d, 90d, 365d, all","disabled":true},{"key":"include_addresses","value":"","description":"Include address data | Type: boolean","disabled":true}]},"description":"## Overview\nBusiness partner / contact statistics — document counts, storage, first/last document dates, and optional addresses (`include_addresses=true`).\n\n**Financial amounts are not included** — call `GET /analytics/contact-stats-financial` separately when invoice totals per contact are needed (expensive aggregation).\n\n**Permissions:** Requires Analytics AI module access on the bearer token.\n**Scope:** Single PaperOffice account (tenant).\n\n---\n**API reference:** `po-analytics-contacts-stats-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get document activity history","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/activity-document?pofid={{pofid}}","host":["{{base_url}}"],"path":["analytics","activity-document"],"query":[{"key":"pofid","value":"{{pofid}}","description":"**ONE OF REQUIRED** | POFID of the document (required unless documents_id is provided). | Type: string"},{"key":"documents_id","value":"","description":"**ONE OF REQUIRED** | Numeric document ID (required unless pofid is provided). | Type: string|number","disabled":true}]},"description":"## Overview\nComplete activity history for a **single document** — revisions, processing events, and user actions where logged. Requires a document identifier (`pofid` or `documents_id`). **Permissions:** Requires Analytics AI module access on the bearer token.\n**Scope:** Single PaperOffice account (tenant). Pass `workspace_id` for sub-users.\n\n## Request parameters\n#### Required alternatives\n\nProvide **at least one** of: `documents_id` **or** `pofid`.\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-analytics-document-activity-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get document distribution stats","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/distribution?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["analytics","distribution"],"query":[{"key":"type","value":"","description":"Distribution criterion | Type: string | Allowed: document_type, workspace, dms_tier, file_extension","disabled":true},{"key":"workspace_id","value":"{{workspace_id}}","description":"Limit to workspace | Type: number","disabled":true}]},"description":"## Overview\nDocument distribution breakdown — by document type, workspace, processing state, or other dimensions available in your estate. Helpful for portfolio analysis and data-quality reviews before BI exports. **Permissions:** Requires Analytics AI module access on the bearer token.\n**Scope:** Single PaperOffice account (tenant). Pass `workspace_id` for sub-users.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-analytics-distribution-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get document trends","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/trends?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["analytics","trends"],"query":[{"key":"period","value":"","description":"Time period | Type: string | Allowed: 7d, 30d, 90d, 365d, all","disabled":true},{"key":"group_by","value":"","description":"Grouping | Type: string | Allowed: day, week, month","disabled":true},{"key":"workspace_id","value":"{{workspace_id}}","description":"Limit to workspace | Type: number","disabled":true}]},"description":"## Overview\nTime-based trends — upload volume, processed pages, storage growth, and related metrics over a selectable period. Parameterize with `period` (e.g. `7d`, `30d`, `1y`) and optional `workspace_id` for scoped tenants. **Permissions:** Requires Analytics AI module access on the bearer token.\n**Scope:** Single PaperOffice account (tenant). Pass `workspace_id` for sub-users.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-analytics-trends-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get financial flow analytics","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/financial-flow","host":["{{base_url}}"],"path":["analytics","financial-flow"],"query":[{"key":"period","value":"","description":"Time period | Type: string | Allowed: 7d, 30d, 90d, 365d, all","disabled":true}]},"description":"## Overview\nCash-flow style analysis — money movement between business partners (Sankey-style aggregates) for the selected period. **Permissions:** Requires Analytics AI module access on the bearer token.\n**Scope:** Single PaperOffice account (tenant). Pass `workspace_id` for sub-users.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-analytics-financial-flow-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get financial summary","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/financial-summary","host":["{{base_url}}"],"path":["analytics","financial-summary"],"query":[{"key":"period","value":"","description":"Time period | Type: string | Allowed: 7d, 30d, 90d, 365d, all","disabled":true}]},"description":"Financial summary — incoming/outgoing invoice totals, top partners, and period aggregates derived from extracted document fields. Not a certified accounting ledger — use for operational BI; validate totals against source documents when required. **Permissions:** Requires Analytics AI module access on the bearer token.\n**Scope:** Single PaperOffice account (tenant). Pass `workspace_id` for sub-users.\n\n---\n**API reference:** `po-analytics-financial-summary-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get meta field analysis","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/meta-fields-analysis","host":["{{base_url}}"],"path":["analytics","meta-fields-analysis"]},"description":"## Overview\nMeta-field coverage analysis across documents (slow endpoint — typically 10–30 seconds).\n\nUse a client timeout of at least **35 seconds** and a conservative `limit` on large workspaces.\n\n## Performance\nLarge accounts may need **10–30 seconds**. Use `limit` / `page` query parameters for interactive use (recommended: `limit=10`). This endpoint performs heavy aggregation and is not cached.\n\n---\n**API reference:** `po-analytics-meta-fields-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get overdue financial items","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/financial-overdue","host":["{{base_url}}"],"path":["analytics","financial-overdue"]},"description":"## Overview\nOverdue invoices — documents past due date with amounts, aging buckets, and partner references where extracted. **Permissions:** Requires Analytics AI module access on the bearer token.\n**Scope:** Single PaperOffice account (tenant). Pass `workspace_id` for sub-users.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-analytics-financial-overdue-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get upcoming due dates","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/calendar-due-dates","host":["{{base_url}}"],"path":["analytics","calendar-due-dates"],"query":[{"key":"year","value":"","description":"Year (default: current year) | Type: number","disabled":true},{"key":"show_overdue","value":"","description":"Include overdue entries | Type: boolean","disabled":true}]},"description":"## Overview\nUpcoming and past due dates from documents — invoice due dates, contract deadlines, recall dates, and similar date-driven workflows. **Permissions:** Requires Analytics AI module access on the bearer token.\n**Scope:** Single PaperOffice account (tenant). Pass `workspace_id` for sub-users.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-analytics-due-dates-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get user activity ranking","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/activity-users?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["analytics","activity-users"],"query":[{"key":"period","value":"","description":"Time period for activity counters | Type: string | Allowed: 7d, 30d, 90d, 365d, all","disabled":true},{"key":"workspace_id","value":"{{workspace_id}}","description":"**REQUIRED** | Optional workspace filter (required for sub-users). Omit for account-wide scope (root/administrator only). | Type: number"}]},"description":"Rank users by **uploads and document revisions** in the selected time period (not login events). **Scope:** Single PaperOffice account (tenant). Optional `workspace_id` limits activity to one workspace; omit for account-wide rankings (root/administrator). **Sub-users must pass `workspace_id`.** **Permissions:** Analytics AI module — requires module access on the bearer token (account administrator or granted Analytics AI access). This is a team-usage insight endpoint, not workspace-admin-only. **Related:** `GET /analytics/overview`, `GET /analytics/trends`, `GET /analytics/distribution`.\n\n---\n**API reference:** `po-analytics-user-activity-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get embedding clusters","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/embeddings-clusters","host":["{{base_url}}"],"path":["analytics","embeddings-clusters"]},"description":"## Overview\nReturns embedding counts grouped by type (summary, page, paragraph, entity, metadata). For semantic document grouping use advanced search with `mode=semantic`.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-embeddings-clusters-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get embedding statistics","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/embedding-stats","host":["{{base_url}}"],"path":["analytics","embedding-stats"]},"description":"## Overview\nEmbedding statistics — count per type, coverage rate, average quality. Shows semantic index processing status.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-embeddings-stats-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get embedding topics","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/embeddings-topics","host":["{{base_url}}"],"path":["analytics","embeddings-topics"]},"description":"## Overview\nTopic distribution based on embeddings — how documents are distributed across detected topics. Shows confidence scores.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-embeddings-topics-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get entity network graph","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/entities-network","host":["{{base_url}}"],"path":["analytics","entities-network"],"query":[{"key":"type","value":"","description":"Filter by entity type: person, company, location, amount, date, email, phone, iban, invoice_number, contract_number (also accepts PERSON, ORGANIZATION, LOCATION) | Type: string","disabled":true},{"key":"limit","value":"","description":"Max nodes (1-500) | Type: number","disabled":true}]},"description":"## Overview\nEntity network graph — connections between persons, companies, and organizations based on shared documents. Returns nodes and edges for interactive graph visualization.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-entities-network-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Compare workspaces","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/analytics/workspaces-compare?workspace_ids={{workspace_id}},2","host":["{{base_url}}"],"path":["analytics","workspaces-compare"],"query":[{"key":"workspace_ids","value":"{{workspace_id}},2","description":"**REQUIRED** | Comma-separated Workspace IDs (e.g. \"1,2,3\") | Type: string"}]},"description":"## Overview\nCompare workspaces side by side — document count, storage, pages, AI processing rate.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-workspaces-compare` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]}]},{"name":"🧠 Knowledge Graph","description":"# Knowledge Graph\n\nDiscover and query **relationships** between documents, entities, and business partners extracted during Document AI processing. This folder contains the full **Knowledge Graph API-first surface**: document and workspace graphs, entity search, partner lists, timeline, universe view, natural-language **ask**, **multihop** traversal, and **Mermaid** export.\n\n---\n\n## Concepts\n\n| Concept | Meaning |\n|---------|---------|\n| **Entity** | Normalized object (company, person, amount, IBAN, product) |\n| **Edge / relation** | Typed link between documents or entities |\n| **Traversal** | Query neighbors from a seed document or workspace |\n| **Universe graph** | Bounded cross-workspace view — always pass `workspace_id` / `max_nodes` for sub-users |\n\n---\n\n## Typical workflow\n\n1. Ingest and extract via **Document AI → Headless DMS** and **AI-IDP**.\n2. **`GET /knowledge_graph/stats`** — counts and feature flags for the workspace.\n3. **`GET /document_intelligence/knowledge_graph/document/{pofid}`** — interactive document graph.\n4. **`GET /document_intelligence/knowledge_graph/workspace/{workspace_id}`** — workspace-level graph.\n5. **`POST /knowledge_graph/ask`** or **`POST /knowledge_graph/multihop_query`** for advanced queries.\n\n---\n\n## Permissions & scope\n\n- Requires **Analytics AI** module access where enforced by the handler.\n- **Sub-users** must scope calls with **`workspace_id`**; universe endpoints enforce node limits (`max_nodes`).\n- **`GET /knowledge_graph/document_relations`** lists flat relations for integration pipelines.\n\nBuild graphs incrementally as indexing completes — graphs improve as more documents are processed.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.","item":[{"name":"Get business case graph","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/knowledge_graph/business_case?reference=REF-2024-001","host":["{{base_url}}"],"path":["knowledge_graph","business_case"],"query":[{"key":"reference","value":"REF-2024-001","description":"**REQUIRED** | Reference/transaction number (e.g. invoice number, order number, contract number) | Type: string | Example: REF-2024-001"}]},"description":"## Overview\nBusiness case analysis — all documents belonging to a reference/transaction (invoice number, order number, contract). Shows timeline, graph and involved partners.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-knowledge-graph-business-case-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get document relations (path param)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/relations/{{pofid}}","host":["{{base_url}}"],"path":["document_intelligence","relations","{{pofid}}"],"query":[{"key":"direction","value":"","description":"outgoing, incoming, or both | Type: string","disabled":true},{"key":"limit","value":"","description":"Max relations (max: 100) | Type: string","disabled":true},{"key":"include_all_sources","value":"","description":"Include all relation sources (default: false = user-visible relations only). | Type: boolean","disabled":true}],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nGet document relationships — references, supersedes, attachment_of, invoice_for, payment_for, contract_with. Shows linked documents and relation type. Use `include_all_sources=true` to include all detection sources (default: user-facing relations only).\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-knowledge-graph-document-relations-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get document timeline","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/knowledge_graph/timeline?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["knowledge_graph","timeline"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"Limit to workspace | Type: number","disabled":true},{"key":"partner","value":"","description":"Filter by business partner | Type: string","disabled":true},{"key":"from","value":"","description":"Start date (YYYY-MM-DD) | Type: string | Example: 2025-01-01","disabled":true},{"key":"to","value":"","description":"End date (YYYY-MM-DD) | Type: string | Example: 2025-12-31","disabled":true},{"key":"limit","value":"","description":"Max results (1-200) | Type: number","disabled":true},{"key":"offset","value":"","description":"Pagination offset | Type: number","disabled":true}]},"description":"## Overview\nChronological timeline — documents and events sorted by date, filterable by partner and workspace.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-knowledge-graph-timeline-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get image embeddings","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/image_embeddings/{{documents_id}}","host":["{{base_url}}"],"path":["document_intelligence","image_embeddings","{{documents_id}}"],"query":[{"key":"type","value":"","description":"Element type: logo, picture, stamp, signature, page | Type: string","disabled":true},{"key":"include_snippets","value":"","description":"Include WebP preview images | Type: boolean","disabled":true}],"variable":[{"key":"documents_id","value":"","description":"Numeric document ID (alternative to pofid on some endpoints)."}]},"description":"## Overview\nGet image embeddings of a document — visual representations of logos, stamps, signatures, page previews. Enables visual similarity search. NOTE: Requires AI-DMS tier \"ultra\" and documents with detected visual elements (logos, stamps, signatures). Returns empty for documents without visual elements or lower DMS tiers.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-intelligence-image-embeddings-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get intelligence statistics (Document AI)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/stats?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["document_intelligence","stats"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"Limit to workspace | Type: number","disabled":true}]},"description":"## Overview\nGet global Document Intelligence statistics — total entities, embeddings, relations, topics, vision analyses. Shows AI processing status.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-intelligence-stats-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get knowledge graph document entities","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/entities/{{pofid}}","host":["{{base_url}}"],"path":["document_intelligence","entities","{{pofid}}"],"query":[{"key":"include_relations","value":"","description":"Include entity-entity relations | Type: string","disabled":true}],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nReturns all extracted entities for a document — companies, persons, amounts, dates, locations, IBANs, products, and custom types. Requires prior Document AI / IDP processing.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-knowledge-graph-document-entities-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get knowledge graph for document (path param)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/knowledge_graph/document/{{pofid}}","host":["{{base_url}}"],"path":["document_intelligence","knowledge_graph","document","{{pofid}}"],"query":[{"key":"depth","value":"","description":"Hop depth 1-3 (3 requires ULTRA) | Type: string","disabled":true},{"key":"include_entities","value":"","description":"Include entity nodes (companies, persons, etc.) | Type: string","disabled":true},{"key":"max_nodes","value":"","description":"Maximum nodes to return (max: 200) | Type: string","disabled":true}],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nReturns an interactive graph centered on one document — nodes, edges, group styling, and layout options.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-knowledge-graph-document-graph-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get knowledge graph statistics (KG counts)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/knowledge_graph/stats?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["knowledge_graph","stats"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"Optional: Filter by workspace | Type: string","disabled":true}]},"description":"## Overview\nReturns knowledge graph statistics — document, relation, and entity counts, breakdowns by relation and entity type, and available feature flags for the workspace.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-knowledge-graph-stats-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get knowledge graph universe","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/knowledge_graph/universe?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["knowledge_graph","universe"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"**REQUIRED** | Limit graph to one workspace (required for sub-users). | Type: number"},{"key":"max_nodes","value":"","description":"Maximum graph nodes sampled (1–300, default 100). | Type: number","disabled":true},{"key":"similarity_threshold","value":"","description":"Embedding similarity threshold (0.0–1.0). | Type: number","disabled":true},{"key":"include_embeddings","value":"","description":"Include embedding similarity edges. | Type: boolean","disabled":true},{"key":"include_entities","value":"","description":"Include entity nodes. | Type: boolean","disabled":true},{"key":"include_relations","value":"","description":"Include document relation edges. | Type: boolean","disabled":true},{"key":"compact","value":"","description":"Compact mode: strip verbose node/edge metadata (about 70% smaller). | Type: boolean","disabled":true}]},"description":"Sampled knowledge-graph view for visualization — **not** an unbounded export of every document. **Scope:** Single PaperOffice account (tenant), never . Without `workspace_id`, nodes are sampled from all workspaces of the account (newest documents first, capped by `max_nodes`). **Sub-users must pass `workspace_id`.** **Limits:** `max_nodes` default **100**, maximum **300**. Toggle layers with `include_embeddings`, `include_entities`, `include_relations`. Use `compact=true` to reduce payload size. **Performance:** Prefer a specific `workspace_id` on large estates; increase `max_nodes` only when needed.\n\n---\n**API reference:** `po-knowledge-graph-universe-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get partner graph detail","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/knowledge_graph/partner/{{partner_name}}?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["knowledge_graph","partner","{{partner_name}}"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"Limit to workspace | Type: number","disabled":true}],"variable":[{"key":"partner_name","value":"","description":"Path parameter `partner_name` — see the parameter table in the endpoint description."}]},"description":"## Overview\nDetailed view of a single business partner — all documents, business cases, graph connections, statistics. 360-degree partner view.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-knowledge-graph-partner-detail-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get publisher profile","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/publisher/{{documents_id}}","host":["{{base_url}}"],"path":["document_intelligence","publisher","{{documents_id}}"],"variable":[{"key":"documents_id","value":"","description":"Numeric document ID (alternative to pofid on some endpoints)."}]},"description":"## Overview\nDetect the sender/publisher of a document from logos, letterheads, and metadata. Returns company name, logo URL, aliases, and industry when available.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-intelligence-publisher-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get workspace knowledge graph (path param)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/knowledge_graph/workspace/{{workspace_id}}","host":["{{base_url}}"],"path":["document_intelligence","knowledge_graph","workspace","{{workspace_id}}"],"query":[{"key":"include_entities","value":"","description":"Include entity nodes | Type: string","disabled":true},{"key":"max_nodes","value":"","description":"Maximum graph nodes (default 100, maximum 300 per request). | Type: string","disabled":true}],"variable":[{"key":"workspace_id","value":"993","description":"Workspace ID from GET /documents/workspaces-list."}]},"description":"## Overview\nReturns an interactive graph for an entire workspace — all documents and their relationships with the same node/edge structure as the document graph endpoint.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-knowledge-graph-workspace-graph-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"List document topics","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/topics?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["document_intelligence","topics"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"Limit to workspace | Type: number","disabled":true},{"key":"include_documents","value":"","description":"Include document IDs per topic | Type: boolean","disabled":true},{"key":"limit","value":"","description":"Max results | Type: number","disabled":true}]},"description":"## Overview\nList document topics in the account — finance, contracts, HR, legal, projects, customers, suppliers — with document counts per topic.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-intelligence-topics-list` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"List knowledge graph business partners","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/knowledge_graph/partners?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["knowledge_graph","partners"],"query":[{"key":"limit","value":"","description":"Max number of partners (default: 50). | Type: integer","disabled":true},{"key":"sort_by","value":"","description":"sorting | Type: string | Allowed: document_count, total_amount, name","disabled":true},{"key":"entity_type","value":"","description":"Filter after type | Type: string | Allowed: company, person, all","disabled":true},{"key":"workspace_id","value":"{{workspace_id}}","description":"Optional workspace filter. | Type: integer","disabled":true},{"key":"query","value":"","description":"Optional name filter (substring match). | Type: string","disabled":true}]},"description":"List business partners extracted from the knowledge graph — companies and persons linked across documents, with relationship strength and document counts.\n\n## Overview\nReturns partner nodes aggregated from document intelligence and graph read models. Use filters for entity type, sort order, and limits. Responses include partner identifiers, display names, document counts, and optional financial aggregates when meta fields are present.\n\n---\n**API reference:** `po-knowledge-graph-partners` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"List knowledge graph types","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/knowledge_graph/types","host":["{{base_url}}"],"path":["knowledge_graph","types"]},"description":"## Overview\nAvailable relationship, document and reference types in the knowledge graph. Schema/vocabulary reference.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-knowledge-graph-types-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"List publishers","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/publishers","host":["{{base_url}}"],"path":["document_intelligence","publishers"],"query":[{"key":"limit","value":"","description":"Max results (1-500) | Type: number","disabled":true},{"key":"offset","value":"","description":"Pagination offset | Type: number","disabled":true},{"key":"search","value":"","description":"Search publisher name | Type: string","disabled":true},{"key":"industry","value":"","description":"Filter by industry | Type: string","disabled":true}]},"description":"## Overview\nList all automatically detected publishers/senders across all documents. Shows frequency, industry and logo.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-intelligence-publishers-list` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"List reference numbers","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/knowledge_graph/references?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["knowledge_graph","references"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"Limit to workspace | Type: number","disabled":true},{"key":"type","value":"","description":"Reference type: invoice_number, order_number, contract_number | Type: string","disabled":true},{"key":"limit","value":"","description":"Max results (1-500) | Type: number","disabled":true}]},"description":"## Overview\nReference network — all detected reference numbers (invoice, order, contract numbers) and how many documents they connect.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-knowledge-graph-references-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Search entities across documents","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/entities/search?query=contract&workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["document_intelligence","entities","search"],"query":[{"key":"query","value":"contract","description":"**REQUIRED** | Search term (Firmenname, Person, IBAN, etc.) | Type: string | Example: contract"},{"key":"entity_type","value":"","description":"Filter by entity type | Type: string | Allowed: company, person, iban, amount, reference, address, email, phone, date, all","disabled":true},{"key":"limit","value":"","description":"Max. results (default: 20) | Type: integer","disabled":true},{"key":"type","value":"","description":"Entity type filter (e.g. person, organization, location). | Type: string","disabled":true},{"key":"workspace_id","value":"{{workspace_id}}","description":"**REQUIRED** | Workspace ID to scope entity search. | Type: integer"}]},"description":"## Overview\nSearch for entities (companies, persons, IBANs, amounts, etc.) across all documents. Uses the entity index automatically built from your documents by the Document Intelligence pipeline.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-intelligence-entities-search` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]}]}]},{"name":"🌍 Data AI","description":"# Data AI\n\n**Data AI** provides enrichment and validation utilities: **IP geolocation**, **weather**, **map tiles**, **currency exchange**, and **VAT/phone/email/IBAN validation**.\n\n---\n\n## Sub-modules\n\n| Sub-module | Folder | Pattern |\n|------------|--------|---------|\n| **IP Geolocation** | IP Geolocation | Direct REST lookups |\n| **Weather** | Weather | Forecasts and current conditions |\n| **Map Tiles** | Map Tiles | Static map images |\n| **Currency Exchange** | Currency Exchange | Rates and conversion |\n| **Validation & VAT** | Validation & VAT | EU VAT, IBAN, phone, email checks |\n\nMany endpoints are **low-latency REST** suitable for synchronous UI validation. Some allow limited visitor access — see Introduction visitor notes.\n\n---\n\n## Workflows\n\n1. **Signup fraud:** Fake Email (**Security AI**) + IP geolocation + fingerprint\n2. **Invoice check:** **AI-IDP** extracts VAT ID → **Validation & VAT** verifies\n3. **Logistics UI:** Map tile + weather for delivery dashboards\n\n---\n\n## Cross-links\n\n- **Security AI** — device and email signals\n- **Document AI** — consumes validation after extraction\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.\n---\n\n**Integration tips:** Open the **Docs** tab on each request for parameters, auth mode, and response examples. For async pipelines, poll `GET /job/get/{job_id}` after **HTTP 202**. See **Introduction & Basics → Guides** for connection hold, queue priority, and error codes. Credit amounts live under **`GET /job/pricelist`** or in `_billing` on responses — not repeated in every folder overview.\n---\n\n**Integration tips:** Open the **Docs** tab on each request for parameters, auth mode, and response examples. For async pipelines, poll `GET /job/get/{job_id}` after **HTTP 202**. See **Introduction & Basics → Guides** for connection hold, queue priority, and error codes. Credit amounts live under **`GET /job/pricelist`** or in `_billing` on responses — not repeated in every folder overview.","item":[{"name":"🌍 IP Geolocation","description":"# IP Geolocation\n\nResolve IP addresses to country, region, city, ISP, coordinates, timezone, and proxy/VPN hints. Batch endpoints may be available — see collection requests.\n\n---\n\n## Use cases\n\n- Fraud scoring at registration\n- Geo-based content routing\n- Compliance logging\n\n**Bearer token required** (`po_sk_`, `po_ut_`, or `po_pk_`) — not available on VISITOR auto-tier without User-Bearer.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Forward geocoding","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/geocoding/forward","host":["{{base_url}}"],"path":["geocoding","forward"]},"description":"## Overview\nForward geocoding: resolve a street address or place name to latitude/longitude coordinates.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-geocoding-forward` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"address","type":"text","description":"**REQUIRED** | Full or partial address in any language/script | Type: string","value":"東京都渋谷区"},{"key":"lang","type":"text","description":"Response language de, en, ja, ru, ar, zh, etc. | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Get geocoding service status","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/geocoding/status","host":["{{base_url}}"],"path":["geocoding","status"]},"description":"## Overview\nGeocoding service health. Success uses `status: \"operational\"` (not the generic `status: \"success\"` envelope).\n\n---\n**API reference:** `po-geocoding-service-status` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Reverse-geocode coordinates","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/geocoding/reverse?lat=52.52&lng=13.405","host":["{{base_url}}"],"path":["geocoding","reverse"],"query":[{"key":"lat","value":"52.52","description":"**REQUIRED** | Latitude (-90 to 90). | Type: number | Example: 52.52"},{"key":"lng","value":"13.405","description":"**REQUIRED** | Longitude (-180 to 180). Alias: lon on the API. | Type: number | Example: 13.405"},{"key":"lang","value":"","description":"Response language (e.g. de, en). | Type: string | Example: de","disabled":true}]},"description":"## Overview\nResolves **GPS coordinates** to a human-readable address via `GET /geocoding/reverse`.\n\nUse **Tool-ID** `po_geocoding_reverse`. For address → coordinates use `po_geocoding_forward` (`POST /geocoding/forward`).\n\n## Required query parameters\n- **lat** — latitude (e.g. `52.52`)\n- **lng** — longitude (e.g. `13.405`; API alias: `lon`)\n\nOptional: **lang** — response language.\n\n## Example\n\n`GET /geocoding/reverse?lat=52.52&lng=13.405&lang=de`\n\n## Error example (HTTP 400)\n\n```json\n{\n\"success\": false,\n\"error\": \"MISSING_COORDINATES\",\n\"message\": \"Parameters \\\"lat\\\" and \\\"lng\\\" (or \\\"lon\\\") are required\"\n}\n```\n\n---\n**API reference:** `po-geocoding-reverse` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Detect IP VPN usage","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/ip2location/vpn","host":["{{base_url}}"],"path":["ip2location","vpn"]},"description":"## Overview\nDetect VPN, proxy, and hosting-provider usage for an IP address. Returns confidence and provider metadata.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-ip-geolocation-vpn-detection` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"ip","type":"text","description":"IPv4 or IPv6 address to look up. Omit to use the caller's IP address. | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Get IP device fingerprint","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/ip2location/device","host":["{{base_url}}"],"path":["ip2location","device"]},"description":"Analyzes device/browser signals and returns a device fingerprint hash plus risk indicators.\n\n**Response scores (0–100):**\n- `confidence_score` — match confidence for the fingerprint (higher = more confident identification).\n- `trust_score` — trustworthiness of the session (higher = lower estimated fraud risk; computed as inverse of internal risk score).\n\nUse both scores together with IP geolocation and VPN detection for layered fraud checks.\n\n**Auth:** Requires `po_sk_` or `po_ut_` Bearer token.\n\n---\n**API reference:** `po-ip-geolocation-device-fingerprint` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"ip","type":"text","description":"IP address to analyze for device fingerprint | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Get IP full information","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/ip2location/full","host":["{{base_url}}"],"path":["ip2location","full"],"query":[{"key":"ip","value":"","description":"IP address to look up. If omitted, the callers IP is used. | Type: string","disabled":true},{"key":"locale","value":"","description":"Response locale (en, de, fr, es, etc.) | Type: string","disabled":true}]},"description":"## Overview\nResolve complete IP geolocation and ISP data for an IPv4/IPv6 address.\n\nSend `ip` as a query parameter. Returns country, region, city, coordinates, ASN, and ISP fields when available.\n\n---\n**API reference:** `po-ip-geolocation-full-all-information` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Get IP location only","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/ip2location/location","host":["{{base_url}}"],"path":["ip2location","location"]},"description":"## Overview\nResolve basic location data for an IP address (country, region, city).\n\nSend `ip` in the JSON body or as a form field. Lightweight Alternative to `GET /ip2location/full`.\n\n---\n**API reference:** `po-ip-geolocation-location` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"ip","type":"text","description":"IPv4 or IPv6 address to look up. Omit to use the caller's IP address. | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"List IP countries","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/ip2location/countrylist","host":["{{base_url}}"],"path":["ip2location","countrylist"]},"description":"## Overview\nGet list of all supported countries with basic info. Returns: - Country codes ISO 2-letter - Country names - Currency codes - Primary languages\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-ip-geolocation-country-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"language","type":"text","description":"Language for country names (e.g. de, en, fr). | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Get weather by IP","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/ip2location/weather","host":["{{base_url}}"],"path":["ip2location","weather"],"query":[{"key":"ip","value":"","description":"Public IPv4/IPv6 to geolocate. If omitted, the caller IP is used (often unsuitable in server-side/MCP calls). | Type: string | Example: 8.8.8.8","disabled":true},{"key":"lang","value":"","description":"Response language. | Type: string | Example: de","disabled":true},{"key":"locale","value":"","description":"Alias for lang. | Type: string | Example: de","disabled":true}]},"description":"## Overview\nWeather for an **IP address** (geolocation + weather) via `GET /ip2location/weather`.\n\nDiffers from `GET /weather`: when coordinates are missing, the API may fall back to the geolocation of the given IP.\n\n## Query parameters\n- **ip** — recommended; public IPv4/IPv6 (if omitted, caller IP is used)\n- **lang** or **locale** — optional response language\n\n**HTTP:** `GET /ip2location/weather?ip=8.8.8.8&lang=en`\n\n---\n**API reference:** `po-weather-by-ip` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"List weather icons","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/ip2location/weathericon_get?condition_code=1000","host":["{{base_url}}"],"path":["ip2location","weathericon_get"],"query":[{"key":"condition_code","value":"1000","description":"**REQUIRED** | WMO weather condition code(s). Comma-separated for multiple icons (e.g. 1000 or 1000,1003,1006). | Type: string | Example: 1000"},{"key":"size","value":"","description":"Icon dimensions. Must match available static assets. | Type: string | Allowed: 64x64, 128x128 | Example: 128x128","disabled":true},{"key":"is_day","value":"","description":"Day (true) or night (false) icon variant. | Type: string | Example: true","disabled":true}]},"description":"## Overview\nReturns weather icons (Base64 PNG or CDN fallback) for one or more WMO **condition_code** values from weather responses.\n\n## Parameters\n- **condition_code** (required): One code or comma-separated list, e.g. `1000` or `1000,1003,1006`\n- **size** (optional, default `128x128`): `64x64` or `128x128`\n- **is_day** (optional, default `true`): `true` for day icons, `false` for night\n\n## Request\n\nAuthenticate with your Bearer token (optional on VISITOR tier; higher limits with token).\n\n**HTTP:** `GET /ip2location/weathericon_get?condition_code=1000&size=128x128&is_day=true`\n\nThe same fields work via `POST` (form-data or `application/x-www-form-urlencoded`).\n\n## Pricing\n\n**1 Credit per condition_code** (comma-separated codes are billed per icon). Example: `condition_code=1000,1003` → 2 Credits.\n\n---\n**API reference:** `po-weather-icons` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]}]},{"name":"🌤️ Weather","description":"# Weather\n\nCurrent conditions, hourly/daily forecasts, and alerts for geographic coordinates or place names.\n\n---\n\n## Integration\n\n- Cache responses in your app (respect cache headers if present)\n- Combine with **Map Tiles** for dashboards\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Get weather by city","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/weather?city=Berlin","host":["{{base_url}}"],"path":["weather"],"query":[{"key":"city","value":"Berlin","description":"**REQUIRED** | City name to geocode (e.g. Berlin, Munich). | Type: string | Example: Berlin"},{"key":"country","value":"","description":"Optional ISO country hint to disambiguate the city (e.g. DE, US). | Type: string | Example: DE","disabled":true},{"key":"lang","value":"","description":"Response language for condition text. | Type: string | Example: de","disabled":true},{"key":"locale","value":"","description":"Alias for lang. | Type: string | Example: de","disabled":true}]},"description":"## Overview\nReturns current weather and forecast for a **city name** (geocoded server-side) via `GET /weather`.\n\nUse **Tool-ID** `po_weather_by_city`. For raw coordinates use `po_weather_by_coordinates`.\n\n## Required query parameters\n- **city** — city name (e.g. `Berlin`)\n\nOptional: **country** — ISO hint (e.g. `DE`); **lang** or **locale** — response language (default `en`).\n\n## Example\n\n`GET /weather?city=Berlin&country=DE&lang=de`\n\n## Error examples\n\nMissing city:\n\n```json\n{\n\"status\": \"error\",\n\"code\": \"MISSING_LOCATION_INPUT\",\n\"message\": \"Provide lat and lon (or latitude and longitude), or city (country optional).\"\n}\n```\n\nCity could not be resolved:\n\n```json\n{\n\"status\": \"error\",\n\"code\": \"GEOCODING_FAILED\",\n\"message\": \"Could not resolve city to coordinates.\"\n}\n```\n\n---\n**API reference:** `po-weather-by-city` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Get weather by coordinates","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/weather?lat=52.52&lon=13.405","host":["{{base_url}}"],"path":["weather"],"query":[{"key":"lat","value":"52.52","description":"**REQUIRED** | Latitude (-90 to 90). | Type: number | Example: 52.52"},{"key":"lon","value":"13.405","description":"**REQUIRED** | Longitude (-180 to 180). | Type: number | Example: 13.405"},{"key":"lang","value":"","description":"Response language for condition text (e.g. de, en). | Type: string | Example: de","disabled":true}]},"description":"## Overview\nReturns current weather and a multi-day forecast for **GPS coordinates** via `GET /weather`.\n\nUse **Tool-ID** `po_weather_by_coordinates`. For city-based lookup use `po_weather_by_city` (same path, different required fields). For IP-based lookup use `po_weather_by_ip` (`GET /ip2location/weather`).\n\n## Required query parameters\n- **lat** — latitude (e.g. `52.52` for Berlin)\n- **lon** — longitude (e.g. `13.405` for Berlin)\n\nOptional: **lang** — response language (default `en`).\n\n## Example\n\n`GET /weather?lat=52.52&lon=13.405&lang=de`\n\n## Error example (HTTP 400)\n\nMissing location input:\n\n```json\n{\n\"status\": \"error\",\n\"code\": \"MISSING_LOCATION_INPUT\",\n\"message\": \"Provide lat and lon (or latitude and longitude), or city (country optional).\"\n}\n```\n\nValidation errors are not billed.\n\n---\n**API reference:** `po-weather-by-coordinates` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]}]},{"name":"🗺️ Map Tiles","description":"# Map Tiles\n\nGenerate **static map images** with markers, zoom, and style parameters for embedding in PDFs, emails, or apps.\n\n---\n\n## Notes\n\n- Output is typically image bytes or URL — see per-request Docs\n- Respect third-party tile usage policies configured for your account\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Get map tile","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/maptiles/tiles/get/{{z}}/{{x}}/{{y}}.pbf","host":["{{base_url}}"],"path":["maptiles","tiles","get","{{z}}","{{x}}","{{y}}.pbf"],"variable":[{"key":"z","value":"6","description":"Deep-zoom tile level index."},{"key":"x","value":"34","description":"Deep-zoom tile X coordinate."},{"key":"y","value":"24","description":"Deep-zoom tile Y coordinate."}]},"description":"## Overview\nReturns a **Mapbox Vector Tile** (`.pbf`, gzip) for the slippy-map indices `z`, `x`, `y`.\n\nThis is a **path-parameter** endpoint — not a static map image. Do not send `lat`/`lon` as query parameters.\n\n## Path parameters\n- **z** — zoom level (example: `6`)\n- **x** — tile column (example: `34`)\n- **y** — tile row (example: `24`)\n\n## Example\n\n`GET /maptiles/tiles/get/6/34/24.pbf`\n\nEquivalent public path (without `/get/`): `/maptiles/tiles/6/34/24.pbf`\n\n---\n**API reference:** `po-map-tiles-get-map-tile` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Get static map by coordinates","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/maptiles/staticmap","host":["{{base_url}}"],"path":["maptiles","staticmap"]},"description":"## Overview\nGenerates a **static map image** (PNG) or JSON metadata from **GPS coordinates**.\n\nUse **Tool-ID** `po_map_tiles_static_map_coordinates`. For IP-based lookup use `po_map_tiles_static_map_ip_address` (`GET`/`POST` with `ip`).\n\n## Required body fields\n- **lat** — latitude (e.g. `52.52`)\n- **lon** — longitude (e.g. `13.405`)\n\nOptional: `zoom`, `width`, `height`, `marker`, `format`.\n\n## Example\n\n`POST /maptiles/staticmap` with form fields `lat=52.52`, `lon=13.405`, `zoom=12`, `marker=1`\n\n## Error example (HTTP 400)\n\nMissing or zero coordinates:\n\n```json\n{\n\"status\": \"error\",\n\"message\": \"INVALID_COORDINATES\"\n}\n```\n\n---\n**API reference:** `po-map-tiles-static-map-coordinates` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"lat","type":"text","description":"**REQUIRED** | Latitude (-90 to 90). | Type: number | Example: 52.52","value":"52.52"},{"key":"lon","type":"text","description":"**REQUIRED** | Longitude (-180 to 180). | Type: number | Example: 13.405","value":"13.405"},{"key":"zoom","type":"text","description":"Zoom level (1–16, default 12). | Type: number | Min: 1 | Max: 16","value":"","disabled":true},{"key":"width","type":"text","description":"Image width in pixels (default 400). | Type: number | Min: 100 | Max: 800","value":"","disabled":true},{"key":"height","type":"text","description":"Image height in pixels (default 150). | Type: number | Min: 50 | Max: 600","value":"","disabled":true},{"key":"marker","type":"text","description":"Show marker: `0` (no) or `1` (yes, default). | Type: string","value":"","disabled":true},{"key":"format","type":"text","description":"Output format (default `image`). | Type: string | Allowed: image, png, json, base64","value":"","disabled":true}]}},"response":[]},{"name":"Get static map by IP address","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/maptiles/staticmap?ip=8.8.8.8","host":["{{base_url}}"],"path":["maptiles","staticmap"],"query":[{"key":"ip","value":"8.8.8.8","description":"**REQUIRED** | Public IPv4/IPv6 to center the map (geolocation lookup). | Type: string | Example: 8.8.8.8"},{"key":"zoom","value":"","description":"Zoom level (1–16, default 12). | Type: number | Min: 1 | Max: 16","disabled":true},{"key":"width","value":"","description":"Image width in pixels (default 400). | Type: number | Min: 100 | Max: 800","disabled":true},{"key":"height","value":"","description":"Image height in pixels (default 150). | Type: number | Min: 50 | Max: 600","disabled":true},{"key":"marker","value":"","description":"Show marker: `0` (no) or `1` (yes, default). | Type: string","disabled":true},{"key":"format","value":"","description":"Output format (default `image`). | Type: string | Allowed: image, png, json, base64","disabled":true}]},"description":"## Overview\nGenerates a **static map image** centered on an **IP address** (geolocation lookup).\n\nUse **Tool-ID** `po_map_tiles_static_map_ip_address`. For explicit GPS coordinates use `po_map_tiles_static_map_coordinates` (POST with `lat`/`lon`).\n\n## Required query parameters\n- **ip** — public IPv4/IPv6 (e.g. `8.8.8.8`)\n\nOptional: `zoom`, `width`, `height`, `marker`, `format`.\n\n## Example\n\n`GET /maptiles/staticmap?ip=8.8.8.8&zoom=12&marker=1`\n\n---\n**API reference:** `po-map-tiles-static-map-ip-address` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Style json","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/maptiles/style.json","host":["{{base_url}}"],"path":["maptiles","style.json"]},"description":"## Overview\nGet MapLibre/Mapbox style configuration. Returns: JSON style definition for MapLibre GL JS Use this URL directly in your MapLibre map initialization.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-map-tiles-style-json` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]}]},{"name":"💱 Currency Exchange","description":"# Currency Exchange\n\nReal-time and historical **exchange rates** plus conversion between 150+ currencies.\n\n---\n\n## Usage\n\n- Call before displaying amounts in user locale\n- Pair with **AI-IDP** extracted currency fields for normalization\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Convert currency","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/currency_exchange/convert","host":["{{base_url}}"],"path":["currency_exchange","convert"]},"description":"## Overview\nConvert an amount between two currencies using current exchange rates from the PaperOffice currency service.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-currency-convert-currency` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"from","type":"text","description":"**REQUIRED** | Source currency code (ISO 4217, e.g. EUR). | Type: string | Example: EUR","value":"EUR"},{"key":"to","type":"text","description":"**REQUIRED** | Target currency code (ISO 4217, e.g. USD). | Type: string | Example: USD","value":"USD"},{"key":"amount","type":"text","description":"Amount to convert (default: 1). | Type: number | Example: 100","value":"100"}]}},"response":[]},{"name":"Get currency exchange rates","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/currency_exchange/get_rates","host":["{{base_url}}"],"path":["currency_exchange","get_rates"],"query":[{"key":"from","value":"","description":"Base currency code (ISO 4217) | Type: string","disabled":true},{"key":"amount","value":"","description":"Base amount (default: 1) | Type: string","disabled":true}]},"description":"## Overview\nGet current exchange rates for supported currency pairs. Base currency and quote symbols are configurable.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-currency-get-exchange-rates` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]}]},{"name":"✅ Validation & VAT","description":"# Validation & VAT\n\nValidate **EU VAT numbers**, **IBAN**, phone numbers, and email formats with country-aware rules.\n\n---\n\n## Workflow\n\n1. Extract identifiers via **Document AI → AI-IDP**\n2. Validate before payment or ERP export\n3. Store validation timestamps for audit\n\nResponses are synchronous JSON suitable for form-level feedback.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Validate All (Email + Phone + Website)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/validate/all","host":["{{base_url}}"],"path":["validate","all"]},"description":"## Overview\nValidate email, phone, and/or website in one request. Only provided fields are checked. **Pricing:** 20 credits flat bundle (cheaper than three separate 10-credit calls when all fields are used).\n\n## Request parameters\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-validate-all` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 20 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"email","type":"text","description":"Email address to validate | Type: string","value":"","disabled":true},{"key":"phone","type":"text","description":"Phone number to validate | Type: string","value":"","disabled":true},{"key":"url","type":"text","description":"Website URL to validate (canonical field name). | Type: string","value":"","disabled":true},{"key":"website","type":"text","description":"Alias of `url` — website URL to validate. Prefer `url` in new integrations. | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer | Max: 900 | Example: 100","value":"","disabled":true}]}},"response":[]},{"name":"Validate Email Address","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/validate/email","host":["{{base_url}}"],"path":["validate","email"]},"description":"## Overview\nValidate an email address (syntax and MX lookup).\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-validate-email` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"email","type":"text","description":"**REQUIRED** | Email address to validate | Type: string","value":"user@example.com"}]}},"response":[]},{"name":"Validate Phone Number","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/validate/phone","host":["{{base_url}}"],"path":["validate","phone"]},"description":"## Overview\nValidate a phone number (E.164 format and carrier lookup).\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-validate-phone` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"phone","type":"text","description":"**REQUIRED** | Phone number to validate (with or without country code, e.g. +49171123456) | Type: string","value":"+49301234567"}]}},"response":[]},{"name":"Validate Website URL","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/validate/website","host":["{{base_url}}"],"path":["validate","website"]},"description":"## Overview\nValidate a website URL (DNS, SSL certificate, reachability).\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-validate-website` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"url","type":"text","description":"**REQUIRED** | Website URL to validate (e.g. https://example.com) | Type: string","value":"https://example.com/callback"}]}},"response":[]},{"name":"Get EU VAT Rates","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/vat/rates","host":["{{base_url}}"],"path":["vat","rates"]},"description":"## Overview\nGet EU VAT Rates\n\nReturns current VAT rates for all 27 EU member states including standard and reduced rates.\n\n--- Parameters\nNo parameters required.\n\n## Request parameters\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-vat-rates-get` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Validate EU VAT ID","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/vat/validate","host":["{{base_url}}"],"path":["vat","validate"]},"description":"## Overview\nValidate a European VAT identification number against the EU VIES database. Returns company name, address, validity status, tax context (VAT rates), and optional fraud risk assessment.\n\n## Parameters\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `vat_id` | string | Yes | EU VAT ID with valid format checksum (e.g. `DE111111125`, `FR12345678901`, `NL123456789B01`) |\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-vat-validate` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"vat_id","type":"text","description":"**REQUIRED** | EU VAT ID with valid format checksum (e.g. DE111111125, FR12345678901). | Type: string","value":"DE111111125"},{"key":"ip","type":"text","description":"IP address for fraud cross-check (optional) | Type: string","value":"","disabled":true},{"key":"email","type":"text","description":"Email for fraud cross-check (optional) | Type: string","value":"","disabled":true},{"key":"force_recheck","type":"text","description":"Bypass validation cache and re-query VIES (uses full request credits). | Type: boolean","value":"","disabled":true},{"key":"geocoding","type":"text","description":"Include geocoded address coordinates in the response when available (default: true). | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Calculate Global Tax Quote","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/vat/quote","host":["{{base_url}}"],"path":["vat","quote"]},"description":"## Overview\nCalculate global B2B tax quote for appointments or software without Stripe Tax. Supports EU VAT, Reverse Charge, USA states, Canadian provinces and common global VAT/GST jurisdictions.\n\n## Request parameters\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-tax-quote-calculate` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"buyer_country","type":"text","description":"**REQUIRED** | Buyer country ISO 3166-1 alpha-2 (required, e.g. DE, US). | Type: string","value":"buyer_country_value"},{"key":"buyer_subdivision","type":"text","description":"State/province code for US/CA sales tax (e.g. CA, TX). | Type: string","value":"","disabled":true},{"key":"postal_code","type":"text","description":"Postal/ZIP code for localized tax rates (US/CA). | Type: string","value":"","disabled":true},{"key":"vat_id","type":"text","description":"EU VAT ID for B2B reverse-charge validation (VIES). | Type: string","value":"","disabled":true},{"key":"net_cents","type":"text","description":"**REQUIRED** | Net amount in minor currency units (cents). | Type: integer","value":"1"},{"key":"currency","type":"text","description":"ISO 4217 currency code (e.g. EUR, USD). | Type: string","value":"","disabled":true},{"key":"product_type","type":"text","description":"Product category for tax rules (e.g. software, appointment, service). | Type: string","value":"","disabled":true}]}},"response":[]}]},{"name":"💳 Pricing & Plans","description":"# Pricing & Plans\n\nRead-only **pricing discovery** for integrations: plan tiers, feature flags, included credits, custom plan calculator inputs, and per-service unit matrix (`api_credits_cost`).\n\n---\n\n## Endpoints\n\n| Purpose | Typical use |\n|---------|-------------|\n| **Tiers** | Display plan comparison in your portal |\n| **Calculator** | Estimate credits for a workload |\n| **Job costs** | Map pipeline names to credit units |\n\n**Does not include:** invoices, subscriptions, payment methods — manage those in the PaperOffice app.\n\n**Links:** [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) · live tiers URL in Introduction & Basics.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.","item":[{"name":"List pricing plans and tiers","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/billing/pricing/tiers","host":["{{base_url}}"],"path":["billing","pricing","tiers"],"query":[{"key":"group","value":"","description":"tier group filter: app_tier, api_tier, sla_tier (optional, Default: all) | Type: string | Allowed: app_tier, api_tier, sla_tier","disabled":true}]},"description":"Lists all available PaperOffice pricing plans (tiers) with prices, credits, features and details. Ideal for price comparisons and recommendations.\n\n---\n**API reference:** `po-billing-plans` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","auth":{"type":"noauth"}},"response":[]}]}]},{"name":"📄 Document AI","description":"# Document AI\n\nPaperOffice **Document AI** is the full **headless document lifecycle API**: **capture** (OCR, upload, import), **understand** (AI-IDP extraction, AI document operations), **transform** (PDF AI, anonymization), **store** (Headless DMS, Storage Mounts, templates), **sign** (E-Signatures, signature links), and **migrate** (Import & Migration).\n\nThis section exposes the **complete API-first public surface** — every `visibility=public` Document AI endpoint is listed here (Postman, **llms-full.txt**, and MCP). **35** requests are tagged as **featured masters** for quick onboarding; all sibling endpoints remain fully documented alongside them.\n\n---\n\n## Sub-modules (where to click)\n\n| Sub-module | Postman folder | Primary use |\n|------------|----------------|-------------|\n| **AI-IDP** | AI-IDP | All structured extraction pipelines (invoices, contracts, orders, letters, …) |\n| **AI-OCR** | AI-OCR | Text extraction from scans and images |\n| **PDF AI** | PDF AI | Merge, split, compress, convert, security, AI-assisted PDF workflows |\n| **Document Anonymization** | Document Anonymization | GDPR-oriented redaction |\n| **Headless DMS** | Headless DMS | Full CRUD: upload, download, search, move, rename, delete, folders, tags, trash, workspaces, templates, intelligence |\n| **Storage Mounts** | Storage Mounts | S3, Azure, GCS, SFTP, WebDAV — add, update, delete, browse, health |\n| **E-Signatures** | E-Signatures | Create, list, cancel, remind, download; signature-link flows |\n| **Import & Migration** | Import & Migration | Create, start, status, cancel, delete, retry import jobs |\n| **AI Document Operations** | AI Document Operations | Entities, relations, embeddings, topics (also under Headless DMS) |\n\nEach sub-folder has a **dedicated overview** with module-specific workflows and parameter notes.\n\n---\n\n## Two API patterns (important)\n\n| Pattern | Typical folders | Postman body |\n|---------|-----------------|--------------|\n| **Job pipelines** | AI-IDP, AI-OCR, PDF AI, Anonymization | **form-data** (often includes **files**) |\n| **Direct REST** | Headless DMS CRUD, Storage Mounts, E-Signatures | **JSON** or query params |\n\nMost heavy processing uses `POST /job/add/{handler}___…` with **connection hold** and optional **priority**. Lightweight reads and DMS writes may return synchronously.\n\n---\n\n## Typical cross-module workflows\n\n1. **Inbound invoice:** Upload (DMS) → **AI-IDP** extract fields → tag in workspace → archive or export.\n2. **Scan archive:** **AI-OCR** → index via **Headless DMS** search → **AI Document Operations** entities.\n3. **External share:** **PDF AI** prepare PDF → **E-Signatures** request → poll until signed download.\n4. **Compliance:** **Document Anonymization** → store redacted copy via DMS **document-put**.\n5. **Cloud bridge:** **Storage Mounts** sync → **Import & Migration** bulk load → **Headless DMS** workspaces.\n\n---\n\n## Before you start\n\n- **Authentication:** **Introduction & Basics → Guides → Authentication**\n- **Jobs & polling:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold**\n- **Errors:** **Introduction & Basics → Reference**\n\nStart with **featured** AI-IDP or Headless DMS requests if you are new; use **llms-full.txt** for agent integrations requiring the full endpoint catalog.\n---\n\n## Shared execution model (jobs)\n\n| Concept | Detail |\n|---------|--------|\n| **Bearer token** | Required for all processing endpoints |\n| **Connection hold** | Default `client_wait=true` — hold HTTP up to about 295 s, then **200** or **202** + `poll_url` |\n| **Polling** | `GET /job/get/{job_id}` after **202** or when work exceeds the hold |\n| **Queue priority** | Optional `priority` — omit for plan default; see **Introduction & Basics → Guides** |\n\nCredit amounts are **not** duplicated here — use **`GET /job/pricelist`** or `_billing` on responses.","item":[{"name":"📄 AI-IDP","description":"# AI-IDP (Intelligent Document Processing)\n\n**AI-IDP** extracts structured fields from business documents: invoices, receipts, contracts, purchase orders, letters, hotel bills, payroll stubs, utility bills, vehicle documents, and more. Processing runs as **jobs** with file upload via **form-data**.\n\n---\n\n## What you can do\n\n| Capability | Typical flow |\n|------------|--------------|\n| **Classify & extract** | Upload PDF/image → job → JSON with typed fields |\n| **Finance documents** | Invoice, bank check, utility bill endpoints (also routed here from finance categories) |\n| **Contracts & orders** | Long-form extraction with section-aware fields |\n| **Handwriting** | Supported document types where enabled in SOT |\n\n---\n\n## Request shape\n\n- **Method:** `POST /job/add/…` (pipeline per document type)\n- **Body:** **form-data** — include the document file and optional `priority`, `client_wait`\n- **Result:** Poll `GET /job/get/{job_id}` after **HTTP 202** if needed\n\nUse the request **Docs** tab on each endpoint for required file fields and sample responses.\n\n---\n\n## Best practices\n\n1. Prefer **one document per job** for clearest field mapping.\n2. Cache document-type choice in your app — match the pipeline to the expected layout.\n3. Validate extracted IBAN/VAT externally (**Data AI → Validation & VAT**) when needed.\n4. Store raw files in **Headless DMS** and link extraction results to `workspace_id` where applicable.\n\n---\n\n## Related folders\n\n- **AI-OCR** — when you only need plain text, not structured IDP\n- **Headless DMS** — persistence and search after extraction\n- **PDF AI** — pre-process scans (deskew, split) before IDP\n---\n\n## Shared execution model (jobs)\n\n| Concept | Detail |\n|---------|--------|\n| **Bearer token** | Required for all processing endpoints |\n| **Connection hold** | Default `client_wait=true` — hold HTTP up to about 295 s, then **200** or **202** + `poll_url` |\n| **Polling** | `GET /job/get/{job_id}` after **202** or when work exceeds the hold |\n| **Queue priority** | Optional `priority` — omit for plan default; see **Introduction & Basics → Guides** |\n\nCredit amounts are **not** duplicated here — use **`GET /job/pricelist`** or `_billing` on responses.","item":[{"name":"Extract ID card or passport","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"Extract structured fields from ID cards and passports — name, document number, nationality, and expiry date.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `identity_document`","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"identity_document"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract insurance policy","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract insurance policy fields — policy number, insured party, coverage period, and premium.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `insurance_policy`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"ultra"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"insurance_policy"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract legal document","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract structured sections and parties from legal documents and contracts.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `legal_document`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"ultra"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"legal_document"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract payroll / pay stub","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nPayroll / Pay Stub Extract salary and payroll data. Fields: employee_name, pay_period, gross, net, deductions, taxes, employer\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `payroll`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"ultra"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"payroll"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Parse email files (EML, MSG, PST)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_dataripper___email_parser","host":["{{base_url}}"],"path":["job","add","paperoffice_dataripper___email_parser"]},"description":"Parse email containers (EML, MSG, PST). **Postman:** use **multipart form-data** and upload via the `files` field (pick `public_assets/demo_email.eml` or your own `.eml`/`.msg`). JSON `files` URL arrays are also supported for automation.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n#### Required alternatives\n\nProvide **at least one** of: `file` **or** `file_1` **or** `files`.\n\n**Pipeline:** `paperoffice_dataripper___email_parser` (fixed, do not change the URL path)\n\n---\n**Cost:** 5 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"files","type":"file","description":"**ONE OF REQUIRED** | Email file upload (EML, MSG, or PST). Multipart field `files`. | Type: file (binary)","src":null},{"key":"extract_attachments","type":"text","description":"Extract file attachments from the email into separate outputs | Type: boolean","value":"true"},{"key":"parse_headers","type":"text","description":"Parse email headers (From, To, Subject, Date, Message-ID) | Type: boolean","value":"true"},{"key":"decode_html","type":"text","description":"Decode HTML body content to plain text where applicable | Type: boolean","value":"true"},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"100"},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"true"},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"false"}]}},"response":[]},{"name":"Redact image regions","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_dataripper___redact_image","host":["{{base_url}}"],"path":["job","add","paperoffice_dataripper___redact_image"]},"description":"Redact image regions. Submit via multipart `file`/`file_1`/`files` or JSON `files` with HTTPS URLs. At least one file is required. Include `bounding_boxes` / `redact_boxes` JSON for production use.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `paperoffice_dataripper___redact_image` (fixed, do not change the URL path)\n\n---\n**Cost:** 20 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"files","type":"text","description":"**REQUIRED** | Image files to redact (PNG, JPG, WEBP) | Type: array","value":"[\"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"]"},{"key":"bounding_boxes","type":"text","description":"**REQUIRED** | OCR bounding boxes per page (from a prior OCR pass) | Type: array","value":"[]"},{"key":"redact_boxes","type":"text","description":"**REQUIRED** | List the box-IDs to be blacked out | Type: array","value":"[]"},{"key":"override_boxes","type":"text","description":"Optional manual box IDs to override auto-detected redaction regions | Type: array","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract government form data","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_aiocr___generate","host":["{{base_url}}"],"path":["job","add","paperoffice_aiocr___generate"]},"description":"## Overview\nForm Processing Extract data from filled forms. Fields: all_fields, checkboxes, signatures\n\n## Request parameters\n**Pipeline:** `paperoffice_aiocr___generate` (fixed, do not change the URL path)\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"government_forms"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract handwritten customer form","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_aiocr___generate","host":["{{base_url}}"],"path":["job","add","paperoffice_aiocr___generate"]},"description":"## Overview\nHandwritten Document AI-powered handwriting recognition. Fields: extracted_text, confidence, language\n\n## Request parameters\n**Pipeline:** `paperoffice_aiocr___generate` (fixed, do not change the URL path)\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"ultra"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"handwritten_customer_form"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract handwritten document","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_aiocr___generate","host":["{{base_url}}"],"path":["job","add","paperoffice_aiocr___generate"]},"description":"Handwritten Document AI-powered handwriting recognition. Fields: extracted_text, confidence, language\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `paperoffice_aiocr___generate` (fixed, do not change the URL path)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"ultra"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"handwritten_document"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract US tax forms","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_aiocr___generate","host":["{{base_url}}"],"path":["job","add","paperoffice_aiocr___generate"]},"description":"## Overview\nForm Processing Extract data from filled forms. Fields: all_fields, checkboxes, signatures\n\n## Request parameters\n**Pipeline:** `paperoffice_aiocr___generate` (fixed, do not change the URL path)\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"us_tax_forms"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract hotel invoice","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract hotel invoice fields — guest, stay dates, room charges, taxes, and total amount.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `hotel_invoice`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"hotel_invoice"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Export DATEV SKR03 accounting","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract structured accounting data in DATEV SKR03 format. Fields: document date, document number, posting text, debit/credit account, amount, tax rate.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `accounting_datev`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"accounting_datev"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract bank check data","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"Extract structured data from bank checks — payer, payee, amount, MICR line, and date fields.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `bank_check`","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"bank_check"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract bank details","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract bank account details from financial documents — IBAN, BIC, account holder, and bank name fields.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `bank_details`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"basic"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"bank_details"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract cash receipt data","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract structured fields from cash receipts — amount, date, vendor, and payment method.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `cash_receipt`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"cash_receipt"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract custom fields (IDP)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract custom IDP field definitions configured for the account from uploaded documents.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_fields`: `[{\"key\":\"company_name\",\"description\":\"Name of the company\"},{\"key\":\"invoice_n...`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_fields","type":"text","description":"Custom extraction fields as JSON array | Type: string","value":"[{\"key\":\"company_name\",\"description\":\"Name of the company\"},{\"key\":\"invoice_number\",\"description\":\"Invoice number\"},{\"key\":\"total_amount\",\"description\":\"Total amount with currency\"}]"},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract invoice","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"Extract invoice fields — vendor, line items, amounts, tax, due date, and reference numbers.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `invoice`","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP template name. Default: invoice (English). For localized versions use the dedicated tools (e.g. the German/DATEV-optimized extraction profile in Document AI). Advanced: append :lang:LOCALE for custom localization e.g. invoice:fr:FR | Type: string","value":"invoice"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Additional fields as JSON, e.g., {\"key\":\"has_stamp\",\"description\":\"Is there a stamp?\"} | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract invoice (German/DATEV-optimized)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract data from German invoices with DATEV-compatible fields. Fields: invoice number, date, supplier, customer, net, gross, VAT, IBAN, BIC.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `invoice:de`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"invoice:de = German output, invoice:en = English, invoice:es = Spanish | Type: string","value":"invoice:de"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Additional fields as JSON | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract invoice basic fields","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nLightweight invoice extraction with essential fields only — vendor, total, date, and invoice number.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `idp_light`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"basic"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"idp_light"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract statement of account","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract account statement fields — period, opening balance, transactions, and closing balance.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `statement_of_account`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"statement_of_account"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract utility bill","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract utility bill fields — provider, billing period, consumption, and amount due.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `utility_bill`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"utility_bill"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract letter or mail","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"Letter / Mail Extract letter metadata and content. Fields: sender, recipient, date, subject, body_summary\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `letter_mail`","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"letter_mail"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract receipt","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract retail receipt fields — merchant, line items, tax, and total.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `receipt`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"receipt"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract delivery note","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract delivery note fields — shipper, recipient, items, quantities, and delivery date.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `delivery_note`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"delivery_note"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract purchase order","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract structured purchase order data from an uploaded document via the workflow job pipeline.\n\n**Fields extracted:** order_number, date, vendor, buyer, items, delivery_date, total.\n\nSubmit with **POST /job/add/workflow** using multipart `file` (or `pofid`) plus required workflow discriminator fields. See **Parameters** below.\n\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `order`","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"order"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract shipping waybill","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract shipping waybill fields — tracking number, carrier, sender, recipient, and weight.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `shipping_waybill`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"shipping_waybill"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract construction plan/blueprint","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExtract metadata and annotations from construction plans and blueprints via AI-IDP workflow.\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `construction_plan`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"ultra"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"construction_plan"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract vehicle registration","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nVehicle Registration Extract vehicle registration data. Fields: plate_number, make, model, VIN, owner, registration_date\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `idp_collection`: `vehicle_license`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI processing tier (flat pricing). Basic=OCR+Vision, Premium=+AI Thinking, Ultra=+AI Reasoning. per/per-Max variants add higher page limits. | Type: string | Allowed: basic, basic-per, basic-per-max, premium, premium-per, premium-per-max, ultra, ultra-per, ultra-per-max","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"vehicle_license"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]}]},{"name":"🔍 AI-OCR","description":"# AI-OCR\n\n**AI-OCR** performs optical character recognition on images and scanned PDFs. Use it when you need **readable text** without full structured IDP field mapping.\n\n---\n\n## When to use OCR vs AI-IDP\n\n| Need | Folder |\n|------|--------|\n| Plain text, layout-agnostic | **AI-OCR** |\n| Typed business fields (amounts, dates, parties) | **AI-IDP** |\n\n---\n\n## Execution\n\n- Jobs via `POST /job/add/…` with document upload (**form-data**)\n- Supports multiple languages and mixed layouts (see per-request Docs)\n- Combine with **Headless DMS** to index OCR text for search\n\n---\n\n## Tips\n\n- Higher-resolution scans improve accuracy; use **PDF AI** to rasterize or clean PDFs first if needed.\n- For invoices, **AI-IDP** is usually preferable — OCR alone leaves post-processing to your app.\n---\n\n## Shared execution model (jobs)\n\n| Concept | Detail |\n|---------|--------|\n| **Bearer token** | Required for all processing endpoints |\n| **Connection hold** | Default `client_wait=true` — hold HTTP up to about 295 s, then **200** or **202** + `poll_url` |\n| **Polling** | `GET /job/get/{job_id}` after **202** or when work exceeds the hold |\n| **Queue priority** | Optional `priority` — omit for plan default; see **Introduction & Basics → Guides** |\n\nCredit amounts are **not** duplicated here — use **`GET /job/pricelist`** or `_billing` on responses.","item":[{"name":"Analyze document with AI-OCR","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_aiocr___generate","host":["{{base_url}}"],"path":["job","add","paperoffice_aiocr___generate"]},"description":"## Overview\nAI-powered OCR document analysis — extract text, detect tables, layout, bounding boxes. Modes: text (fast), grid (+ bounding boxes/QR), complete (+ tables/layout/markdown). Optional: create searchable PDF. File input: upload_id (preferred), file_url, or pofid. Call without file input to get an upload link.\n\n## Request parameters\n#### Required alternatives\n\nProvide **at least one** of: `file_1` **or** `file_url` **or** `pofid`.\n\n**Pipeline:** `paperoffice_aiocr___generate` (fixed, do not change the URL path)\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"upload_id","type":"text","description":"Upload ID from the upload page | Type: string","value":"","disabled":true},{"key":"file_url","type":"text","description":"**ONE OF REQUIRED** | Public URL of a PDF or image (Alternative to file_1 upload). | Type: string","value":"","disabled":true},{"key":"file_name","type":"text","description":"Filename (e.g. \"invoice.pdf\", \"scan.png\") | Type: string","value":"","disabled":true},{"key":"pofid","type":"text","description":"**ONE OF REQUIRED** | PaperOffice File ID (alternative to file_1 upload). | Type: string","value":"","disabled":true},{"key":"ocr_mode","type":"text","description":"\"text\" = text only (about 3s/page), \"grid\" = + bounding boxes (about 5s/page), \"complete\" = + tables/layout (about 7s/page). Default: \"complete\" | Type: string | Allowed: text, grid, complete","value":"text"},{"key":"output_searchable_pdf","type":"text","description":"Create searchable PDF (sandwich PDF with invisible OCR layer). Default: false | Type: boolean","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"file_1","type":"file","description":"**ONE OF REQUIRED** | Image or PDF upload (multipart). Supported: PNG, JPG, JPEG, TIFF, BMP, WEBP, PDF. | Type: file","src":null},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract AI-OCR grid boxes","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_aiocr___generate","host":["{{base_url}}"],"path":["job","add","paperoffice_aiocr___generate"]},"description":"Extract AI-OCR grid boxes (layout regions) from a document. Useful for table detection and coordinate-based extraction.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `paperoffice_aiocr___generate` (fixed, do not change the URL path)\n\n**AI-OCR discriminator (Body):**\n- `ocr_mode`: `grid`","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"ocr_mode","type":"text","description":"OCR mode: text fastest, text only, grid + bounding boxes, complete + tables + layout | Type: string | Example: grid","value":"grid"},{"key":"output_searchable_pdf","type":"text","description":"Create searchable PDF Sandwich PDF with invisible OCR layer. Default: false | Type: string","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Extract AI-OCR plain text","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_aiocr___generate","host":["{{base_url}}"],"path":["job","add","paperoffice_aiocr___generate"]},"description":"Extract plain text from a document via AI-OCR without full layout analysis. Fast path for searchable text.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `paperoffice_aiocr___generate` (fixed, do not change the URL path)\n\n**AI-OCR discriminator (Body):**\n- `ocr_mode`: `text`","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"ocr_mode","type":"text","description":"OCR mode: text fastest, text only, grid + bounding boxes, complete + tables + layout | Type: string | Example: text","value":"text"},{"key":"output_searchable_pdf","type":"text","description":"Create searchable PDF Sandwich PDF with invisible OCR layer. Default: false | Type: string","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Run complete AI-OCR analysis","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_aiocr___generate","host":["{{base_url}}"],"path":["job","add","paperoffice_aiocr___generate"]},"description":"Run a complete AI-OCR analysis on a document. Returns structured text, layout blocks, tables, and confidence metadata in one job.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `paperoffice_aiocr___generate` (fixed, do not change the URL path)\n\n**AI-OCR discriminator (Body):**\n- `ocr_mode`: `complete`","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"ocr_mode","type":"text","description":"OCR mode: text fastest, text only, grid + bounding boxes, complete + tables + layout | Type: string | Example: complete","value":"complete"},{"key":"output_searchable_pdf","type":"text","description":"Create searchable PDF Sandwich PDF with invisible OCR layer. Default: false | Type: string","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]}]},{"name":"📄 PDF AI","description":"# PDF AI\n\n**PDF AI** covers AI-assisted and classical PDF operations: merge, split, compress, convert (HTML/office/image/ebook → PDF), form filling, and intelligent splitting.\n\n---\n\n## Operations\n\n| Category | Examples |\n|----------|----------|\n| **Transform** | Merge, split, compress, rotate |\n| **Convert** | HTML, Office, images, ebooks → PDF |\n| **AI-assisted** | Document splitting, layout-aware processing |\n\nMost write operations are **jobs** with **form-data** uploads. Check each request for whether output is inline JSON, URL, or download token.\n\n---\n\n## Workflows\n\n1. **Inbound bundle:** Merge uploaded parts → run **AI-IDP** on result PDF.\n2. **Web capture:** HTML → PDF → store in **Headless DMS**.\n3. **Large scan:** AI split into logical documents → per-part IDP jobs.\n\n---\n\n## Related\n\n- **AI-OCR** / **AI-IDP** on PDF outputs\n- **E-Signatures** on finalized PDFs\n---\n\n## Shared execution model (jobs)\n\n| Concept | Detail |\n|---------|--------|\n| **Bearer token** | Required for all processing endpoints |\n| **Connection hold** | Default `client_wait=true` — hold HTTP up to about 295 s, then **200** or **202** + `poll_url` |\n| **Polling** | `GET /job/get/{job_id}` after **202** or when work exceeds the hold |\n| **Queue priority** | Optional `priority` — omit for plan default; see **Introduction & Basics → Guides** |\n\nCredit amounts are **not** duplicated here — use **`GET /job/pricelist`** or `_billing` on responses.","item":[{"name":"Add password to PDF","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/pdfstudio___lock_with_password_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___lock_with_password_pdf"]},"description":"## Overview\nAdd password protection to a PDF via the PDF AI workflow pipeline.\n\n## Request parameters\n**Pipeline:** `pdfstudio___lock_with_password_pdf` (fixed, do not change the URL path)\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"password","type":"text","description":"PDF password to set (min. 8 characters). | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Compress PDF","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/job/add/pdfstudio___compress_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___compress_pdf"]},"description":"Compress a PDF to reduce file size while preserving readability. Submit via `POST /job/add/pdfstudio___compress_pdf` with multipart `file`/`files` or a JSON `files` array of HTTPS URLs (Bearer token required for protected demo URLs).\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___compress_pdf` (fixed, do not change the URL path)\n\n---\n**Cost:** 20 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"files\": [\n        \"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"\n    ],\n    \"quality\": \"medium\",\n    \"linearize\": true,\n    \"priority\": \"{{priority}}\",\n    \"client_wait\": true,\n    \"async_only\": false\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Convert eBook to PDF","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/pdfstudio___ebook_to_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___ebook_to_pdf"]},"description":"Convert eBooks (EPUB, MOBI) to PDF. Submit via multipart `file`/`file_1`/`files` or JSON `files` with HTTPS URLs. At least one file is required.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___ebook_to_pdf` (fixed, do not change the URL path)\n\n---\n**Cost:** 20 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"files","type":"text","description":"**REQUIRED** | JSON array of HTTPS file URLs or multipart `files[]` uploads. | Type: array","value":"[\"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"]"},{"key":"output_format","type":"text","description":"Output format (default: pdf) | Type: string | Allowed: pdf","value":"","disabled":true},{"key":"page_size","type":"text","description":"Target page size for e-book conversion (e.g. A4, letter). | Type: string | Allowed: A4, A3, Letter","value":"","disabled":true},{"key":"margin","type":"text","description":"Seitenrand in mm | Type: integer | Max: 50","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true},{"key":"file","type":"file","description":"Multipart file upload (primary input). | Type: file (binary)","src":null,"disabled":true},{"key":"file_1","type":"file","description":"Multipart file upload field `file_1`. | Type: file (binary)","src":null,"disabled":true}]}},"response":[]},{"name":"Convert images to PDF","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/pdfstudio___image_to_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___image_to_pdf"]},"description":"Convert images (JPG, PNG, TIFF) to PDF. Submit via multipart `file`/`file_1`/`files` or JSON `files` with HTTPS URLs. At least one file is required.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___image_to_pdf` (fixed, do not change the URL path)","body":{"mode":"formdata","formdata":[{"key":"files","type":"text","description":"**REQUIRED** | JSON array of HTTPS file URLs or multipart `files[]` uploads. | Type: array","value":"[\"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_document.jpg\"]"},{"key":"fit_to_a4","type":"text","description":"Scale the image to A4 format with a white background | Type: boolean","value":"","disabled":true},{"key":"merge","type":"text","description":"Merge all bills into a single PDF (default: true) | Type: boolean","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true},{"key":"file","type":"file","description":"Multipart file upload (primary input). | Type: file (binary)","src":null,"disabled":true},{"key":"file_1","type":"file","description":"Multipart file upload field `file_1`. | Type: file (binary)","src":null,"disabled":true}]}},"response":[]},{"name":"Convert Office files to PDF","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/pdfstudio___office_to_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___office_to_pdf"]},"description":"Convert Office documents (Word, Excel, PowerPoint) to PDF. Submit via multipart `file`/`file_1`/`files` or JSON `files` with HTTPS URLs. At least one file is required.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___office_to_pdf` (fixed, do not change the URL path)\n\n---\n**Cost:** 30 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"files","type":"text","description":"**REQUIRED** | JSON array of HTTPS file URLs or multipart `files[]` uploads. | Type: array","value":"[\"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"]"},{"key":"provider","type":"text","description":"Conversion Engine (automatic selection for optimal quality) | Type: string | Allowed: auto","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true},{"key":"file","type":"file","description":"Multipart file upload (primary input). | Type: file (binary)","src":null,"disabled":true},{"key":"file_1","type":"file","description":"Multipart file upload field `file_1`. | Type: file (binary)","src":null,"disabled":true}]}},"response":[]},{"name":"Convert PDF to Excel","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/job/add/pdfstudio___pdf_to_excel","host":["{{base_url}}"],"path":["job","add","pdfstudio___pdf_to_excel"]},"description":"Convert a PDF spreadsheet or table layout into an Excel workbook. Pipeline: `pdfstudio___pdf_to_excel`.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___pdf_to_excel` (fixed, do not change the URL path)\n\n---\n**Cost:** 30 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"files\": [\n        \"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"\n    ],\n    \"priority\": \"{{priority}}\",\n    \"client_wait\": true,\n    \"async_only\": false\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Convert PDF to JPG","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/pdfstudio___pdf_to_jpg","host":["{{base_url}}"],"path":["job","add","pdfstudio___pdf_to_jpg"]},"description":"Rasterize PDF pages to JPG images. Pipeline: `pdfstudio___pdf_to_jpg`.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___pdf_to_jpg` (fixed, do not change the URL path)\n\n---\n**Cost:** 20 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"files","type":"text","description":"**REQUIRED** | PDF files | Type: array","value":"[\"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"]"},{"key":"quality","type":"text","description":"Quality (Integer) | Type: integer | Min: 10 | Max: 100","value":"","disabled":true},{"key":"max_size","type":"text","description":"Max size (Integer) | Type: integer","value":"","disabled":true},{"key":"dpi","type":"text","description":"Resolution in DPI (default: 150) | Type: integer","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Convert PDF to PDF/A","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/job/add/pdfstudio___pdf_to_pdfa","host":["{{base_url}}"],"path":["job","add","pdfstudio___pdf_to_pdfa"]},"description":"Convert a PDF to PDF/A for long-term archival compliance. Pipeline: `pdfstudio___pdf_to_pdfa`.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___pdf_to_pdfa` (fixed, do not change the URL path)\n\n---\n**Cost:** 20 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"files\": [\n        \"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"\n    ],\n    \"level\": \"pdfa-2b\",\n    \"priority\": \"{{priority}}\",\n    \"client_wait\": true,\n    \"async_only\": false\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Convert PDF to PowerPoint","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/job/add/pdfstudio___pdf_to_powerpoint","host":["{{base_url}}"],"path":["job","add","pdfstudio___pdf_to_powerpoint"]},"description":"Convert a PDF presentation into an editable PowerPoint file. Pipeline: `pdfstudio___pdf_to_powerpoint`.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___pdf_to_powerpoint` (fixed, do not change the URL path)\n\n---\n**Cost:** 30 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"files\": [\n        \"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"\n    ],\n    \"priority\": \"{{priority}}\",\n    \"client_wait\": true,\n    \"async_only\": false\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Convert PDF to WebP","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/pdfstudio___pdf_to_webp","host":["{{base_url}}"],"path":["job","add","pdfstudio___pdf_to_webp"]},"description":"Rasterize PDF pages to WebP images. Pipeline: `pdfstudio___pdf_to_webp`.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___pdf_to_webp` (fixed, do not change the URL path)\n\n---\n**Cost:** 20 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"files","type":"text","description":"**REQUIRED** | PDF files | Type: array","value":"[\"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"]"},{"key":"quality","type":"text","description":"Quality (Integer) | Type: integer | Min: 10 | Max: 100","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Convert PDF to Word","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/job/add/pdfstudio___pdf_to_word","host":["{{base_url}}"],"path":["job","add","pdfstudio___pdf_to_word"]},"description":"Convert a PDF to an editable Word document while preserving layout where possible.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___pdf_to_word` (fixed, do not change the URL path)","body":{"mode":"raw","raw":"{\n    \"files\": [\n        \"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"\n    ],\n    \"priority\": \"{{priority}}\",\n    \"client_wait\": true,\n    \"async_only\": false\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Convert URL to PDF","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/pdfstudio___url_to_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___url_to_pdf"]},"description":"Render a public HTTPS page to PDF. Pipeline: `pdfstudio___url_to_pdf` — set `url` (e.g. `https://paperoffice.ai`).\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___url_to_pdf` (fixed, do not change the URL path)\n\n---\n**Cost:** 30 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"url","type":"text","description":"**REQUIRED** | Public http(s) URL to render. Private, loopback, and metadata IPs are blocked server-side. | Type: string","value":"https://paperoffice.ai"},{"key":"screen_width","type":"text","description":"Browser viewport width in pixels | Type: integer","value":"","disabled":true},{"key":"screen_height","type":"text","description":"Browser viewport height in pixels | Type: integer","value":"","disabled":true},{"key":"page_size","type":"text","description":"PDF page size | Type: string | Allowed: A4, A3, A5, Letter, Legal, Tabloid","value":"","disabled":true},{"key":"page_orientation","type":"text","description":"Page orientation: portrait or landscape. | Type: string | Allowed: portrait, landscape","value":"","disabled":true},{"key":"page_margins","type":"text","description":"Page margins in pixels | Type: integer","value":"","disabled":true},{"key":"scale","type":"text","description":"Scale factor 0.1-2.0 | Type: string","value":"","disabled":true},{"key":"print_background","type":"text","description":"Print background colors/images (true/false) | Type: string | Allowed: true, false","value":"","disabled":true},{"key":"page_ranges","type":"text","description":"Pages to print, e.g. 1-5,8 | Type: string","value":"","disabled":true},{"key":"header_template","type":"text","description":"HTML header template | Type: string","value":"","disabled":true},{"key":"footer_template","type":"text","description":"HTML footer template | Type: string","value":"","disabled":true},{"key":"remove_classes","type":"text","description":"CSS selectors to remove | Type: string","value":"","disabled":true},{"key":"cookies","type":"text","description":"Advanced: JSON array of cookies for authenticated pages. | Type: string","value":"","disabled":true},{"key":"extra_headers","type":"text","description":"Advanced: JSON object of extra HTTP request headers. | Type: string","value":"","disabled":true},{"key":"user_agent","type":"text","description":"Custom User-Agent | Type: string","value":"","disabled":true},{"key":"wait_until","type":"text","description":"Navigation completion event | Type: string | Allowed: load, domcontentloaded, networkidle0, networkidle2","value":"","disabled":true},{"key":"timeout","type":"text","description":"Navigation timeout in ms | Type: integer","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Edit PDF metadata","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/job/add/pdfstudio___edit_metadata_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___edit_metadata_pdf"]},"description":"## Overview\nEdit or read PDF metadata via pipeline `pdfstudio___edit_metadata_pdf`.\n\nWhen `operation` is `edit` (default), **`metadata`** object is required (at least `title` recommended).\n\n**Pipeline:** `pdfstudio___edit_metadata_pdf` (fixed, do not change the URL path)\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"files\": [\n        \"{{base_url}}\\/download\\/demo\\/demo_invoice.pdf\"\n    ],\n    \"operation\": \"edit\",\n    \"metadata\": {\n        \"title\": \"Example document title\",\n        \"author\": \"PaperOffice\",\n        \"subject\": \"Metadata edit example\",\n        \"keywords\": \"pdf, metadata\"\n    },\n    \"priority\": \"{{priority}}\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Merge pdf","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/pdfstudio___merge_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___merge_pdf"]},"description":"Merge multiple PDF files into a single document. Order is determined by input file sequence.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n#### Required alternatives\n\nProvide **at least one** of: `file_urls` **or** `pofids`.\n\n**Pipeline:** `pdfstudio___merge_pdf` (fixed, do not change the URL path)","body":{"mode":"formdata","formdata":[{"key":"pofids","type":"text","description":"**ONE OF REQUIRED** | Array of PaperOffice Document IDs (pofids) to merge in order. Min 2, max 50. | Type: array","value":"[\"{{pofid}}\",\"{{pofid_2}}\"]"},{"key":"file_urls","type":"text","description":"**ONE OF REQUIRED** | Alternative: public URLs of PDFs to download and merge. | Type: array","value":"","disabled":true},{"key":"pofid","type":"text","description":"Single PaperOffice Document ID (rarely useful alone — merge expects 2+). | Type: string","value":"{{pofid}}","disabled":true},{"key":"order","type":"text","description":"Optional explicit merge order as 0-based indices into pofids/file_urls. | Type: array","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"output_filename","type":"text","description":"Name of the merged output file | Type: string","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Remove password from PDF","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/pdfstudio___unlock_with_password_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___unlock_with_password_pdf"]},"description":"## Overview\nRemove password protection from a PDF when the current password is known.\n\n## Request parameters\n**Pipeline:** `pdfstudio___unlock_with_password_pdf` (fixed, do not change the URL path)\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | PaperOffice File ID to decrypt the PDFs | Type: string","value":"{{pofid}}"},{"key":"password","type":"text","description":"**REQUIRED** | Current PDF password (required to remove protection). | Type: string","value":"<your-password>"},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Remove restrictions","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/pdfstudio___remove_restrictions_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___remove_restrictions_pdf"]},"description":"## Overview\nRemove printing and editing restrictions from a password-protected PDF.\n\nUpload the PDF as multipart `file_1`. Optional `password` when the file is encrypted.\n\nReturns an unlocked PDF via the standard job runtime — poll `GET /job/get/{job_id}` when HTTP 202.\n\n**Pipeline:** `pdfstudio___remove_restrictions_pdf` (fixed, do not change the URL path)\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Rotate pdf","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/job/add/pdfstudio___rotate_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___rotate_pdf"]},"description":"Rotate PDF pages by 90°, 180°, or 270°. Pipeline: `pdfstudio___rotate_pdf`.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___rotate_pdf` (fixed, do not change the URL path)\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"files\": [\n        \"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"\n    ],\n    \"angle\": \"90\",\n    \"priority\": \"{{priority}}\",\n    \"page_range\": \"all\",\n    \"client_wait\": true,\n    \"async_only\": false\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Split PDF","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/job/add/pdfstudio___split_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___split_pdf"]},"description":"Split a PDF into separate files by page ranges or bookmarks. Pipeline: `pdfstudio___split_pdf`.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___split_pdf` (fixed, do not change the URL path)\n\n---\n**Cost:** 20 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"files\": [\n        \"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"\n    ],\n    \"mode\": \"burst\",\n    \"priority\": \"{{priority}}\",\n    \"client_wait\": true,\n    \"async_only\": false\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Split PDF via AI","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"Split a PDF into logical segments using AI layout analysis. Returns separate documents or page ranges.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `template`: `pdf_ai_split`","body":{"mode":"formdata","formdata":[{"key":"file","type":"file","description":"**REQUIRED** | PDF file to analyze and split | Type: file","src":null},{"key":"template","type":"text","description":"Workflow template (required discriminator for this tool). | Type: string","value":"pdf_ai_split"},{"key":"naming_instruction","type":"text","description":"Naming pattern for output files optional | Type: string","value":"","disabled":true},{"key":"locale","type":"text","description":"Locale for ALL output: 'de_DE', 'en_US', 'fr_FR' - affects document_type, reasoning, filenames | Type: string","value":"","disabled":true},{"key":"document_types","type":"text","description":"Allowed types, comma-separated: 'invoice,Schreiben,quote' optional | Type: string","value":"","disabled":true},{"key":"date_format","type":"text","description":"Date format: 'YYYY-MM-DD', 'DD.MM.YYYY', 'MM/DD/YYYY' optional | Type: string","value":"","disabled":true},{"key":"include_document_type","type":"text","description":"Include document_type in response default: false | Type: string","value":"","disabled":true},{"key":"include_date","type":"text","description":"Include date in response default: false | Type: string","value":"","disabled":true},{"key":"include_sender","type":"text","description":"Include sender in response default: false | Type: string","value":"","disabled":true},{"key":"include_reasoning","type":"text","description":"Include reasoning in response default: false | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Unlock PDF with password","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/job/add/pdfstudio___unlock_with_password_pdf","host":["{{base_url}}"],"path":["job","add","pdfstudio___unlock_with_password_pdf"]},"description":"Remove password protection from an encrypted PDF when the password is supplied. Pipeline: `pdfstudio___unlock_with_password_pdf`.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `pdfstudio___unlock_with_password_pdf` (fixed, do not change the URL path)\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"files\": [\n        \"https:\\/\\/api.paperoffice.ai\\/latest\\/download\\/demo\\/demo_invoice.pdf\"\n    ],\n    \"password\": \"<your-password>\",\n    \"priority\": \"{{priority}}\",\n    \"client_wait\": true,\n    \"async_only\": false\n}","options":{"raw":{"language":"json"}}}},"response":[]}]},{"name":"🔒 Document Anonymization","description":"# Document Anonymization\n\n**Document Anonymization** detects and redacts personal identifiable information (names, addresses, IBANs, identifiers) in documents and images for GDPR-aligned sharing.\n\n---\n\n## Usage\n\n- Submit source files as **job** pipelines (**form-data**)\n- Review redaction metadata in job results before distributing exports\n- Pair with **Headless DMS** retention policies for controlled copies\n\n---\n\n## When to use\n\n- External auditor packages\n- Public attachments\n- Training data export without PII\n\nAlways verify redaction on a sample page before bulk automation.\n---\n\n## Shared execution model (jobs)\n\n| Concept | Detail |\n|---------|--------|\n| **Bearer token** | Required for all processing endpoints |\n| **Connection hold** | Default `client_wait=true` — hold HTTP up to about 295 s, then **200** or **202** + `poll_url` |\n| **Polling** | `GET /job/get/{job_id}` after **202** or when work exceeds the hold |\n| **Queue priority** | Optional `priority` — omit for plan default; see **Introduction & Basics → Guides** |\n\nCredit amounts are **not** duplicated here — use **`GET /job/pricelist`** or `_billing` on responses.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Anonymize document (single-step)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"Anonymize a document in a single workflow step. Detects and redacts PII according to configured rules.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `template`: `document_anonymize`","body":{"mode":"formdata","formdata":[{"key":"template","type":"text","description":"Workflow template | Type: string","value":"document_anonymize"},{"key":"file","type":"file","description":"**REQUIRED** | PDF or image file to anonymize | Type: file","src":null},{"key":"pofid","type":"text","description":"Or: existing DMS document POFID | Type: string","value":"{{pofid}}","disabled":true},{"key":"redact_categories","type":"text","description":"Categories: all, none, names, addresses, phone, email, iban, tax_ids, dates, financial, contact, identity | Type: string","value":"","disabled":true},{"key":"whitelist","type":"text","description":"Comma-separated terms to NEVER redact | Type: string","value":"","disabled":true},{"key":"custom_redact","type":"text","description":"Additional terms to ALWAYS redact | Type: string","value":"","disabled":true},{"key":"custom_instructions","type":"text","description":"Free-text AI instructions e.g. Also redact all prices | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Apply redaction","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nStep 2: Apply Redaction. Applies black boxes to the specified regions and generates the final PDF. Important: Use the same job context from Step 1 (pass the job_id from the detect/preview response).\n\n## Request parameters\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `template`: `anonymization___request`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"files","type":"file","description":"**REQUIRED** | HTTPS URL from Step 1 `job_result` — typically `https://api.paperoffice.ai/latest/job/download/{download_token}` (not a raw image URL). | Type: file | Example: [\"https:\\/\\/api.paperoffice.ai\\/latest\\/job\\/download\\/YOUR_DOWNLOAD_TOKEN_FROM_STEP_1\"]","src":null},{"key":"boxes_by_page","type":"text","description":"JSON object: page number 5 digits → array of box indices from redact_box_ids | Type: string","value":"","disabled":true},{"key":"redact_color","type":"text","description":"Redaction color default: black | Type: string","value":"","disabled":true},{"key":"output_pdf","type":"text","description":"true = output PDF, false = output redacted images | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true},{"key":"template","type":"text","description":"Workflow template name (required to route this job) | Type: string | Example: anonymization___request","value":"anonymization___request"}]}},"response":[]},{"name":"Detect PII preview","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"Preview detected PII entities in a document before anonymization. Returns entity types, spans, and confidence scores.\n#### Connection hold & polling\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** while the job runs, up to the **dynamic pipeline timeout** (priority, pages, pipeline type; minimum about 20s, infrastructure cap about 295s). Returns the finished result when ready.\n- **Hold exceeded:** If the job is not finished in time → **HTTP 202** with `job_id`, `poll_url`, `max_wait_seconds`, and `client_wait: false`. The job **continues in the background** — poll `GET /job/get/{job_id}` every 5–10 seconds.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` immediately (about 100ms), then poll as above.\n\n**Response fields:** `client_wait` (boolean) — whether this response used connection hold; `max_wait_seconds` — actual hold duration attempted.\n\n**Note:** Queue `priority` controls billing and queue speed only — see collection guide **Queue priority (billing & speed)**.\n\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `template`: `document_anonymize_preview`","body":{"mode":"formdata","formdata":[{"key":"template","type":"text","description":"Workflow: PDF → PNG → OCR → PII Detection | Type: string","value":"document_anonymize_preview"},{"key":"file","type":"file","description":"**REQUIRED** | PDF or Image file PNG, JPG | Type: file","src":null},{"key":"pofid","type":"text","description":"Optional PaperOffice DMS document ID instead of file | Type: string","value":"{{pofid}}","disabled":true},{"key":"redact_categories","type":"text","description":"Categories: all, none, names, addresses, phone, email, iban, tax_ids, dates, financial, contact, identity | Type: string","value":"","disabled":true},{"key":"whitelist","type":"text","description":"Terms to NEVER mark for redaction comma-separated | Type: string","value":"","disabled":true},{"key":"custom_redact","type":"text","description":"Additional terms to ALWAYS mark for redaction | Type: string","value":"","disabled":true},{"key":"custom_instructions","type":"text","description":"Free-text instructions for AI e.g. 'Also redact all prices' | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]}]},{"name":"📁 Headless DMS","description":"# Headless DMS\n\nThe **Headless DMS** is PaperOffice document management without a UI: full **CRUD** and lifecycle — upload, download, move, rename, delete, restore, folders, tags, comments, trash, legal hold, revisions, workspaces, templates, semantic search, and AI document operations.\n\n---\n\n## Capability areas\n\n| Area | Operations |\n|------|------------|\n| **Documents** | Upload (`document-put`), get, download, move, rename, delete, restore, batch, versions |\n| **Folders** | Create, list, update, dissolve |\n| **Tags & comments** | Add, list, remove tags; create, list, resolve comments |\n| **Trash** | List, empty, settings; restore from trash |\n| **Search** | Keyword, semantic vector, full-text, hybrid |\n| **Workspaces** | List, create, update, delete — tenant/project isolation |\n| **Templates** | List, create, get, update, delete; create document from template |\n| **Intelligence** | Entities, relations, topics, embeddings, vision, meta fields |\n| **Lifecycle** | Legal hold, lifecycle transitions, audit trail |\n\n---\n\n## API mix\n\n- **Jobs** for heavy processing (embeddings, bulk analysis, AI split)\n- **Direct REST** for CRUD reads/writes where latency matters\n\nRead each request's Docs tab — body mode varies (**form-data** vs **raw JSON**).\n\n---\n\n## Integration pattern\n\n1. Upload document → receive document ID (`pofid`)\n2. Run **AI-IDP** or **AI-OCR** jobs referencing stored files where supported\n3. Tag, folder, or move into a **workspace**\n4. Query **AI Document Operations** or search APIs for retrieval\n\n---\n\n## Related\n\n- **Storage Mounts** — external object stores\n- **Import & Migration** — bulk initial load\n- **E-Signatures** — outbound signing workflows\n---\n\n## Shared execution model (jobs)\n\n| Concept | Detail |\n|---------|--------|\n| **Bearer token** | Required for all processing endpoints |\n| **Connection hold** | Default `client_wait=true` — hold HTTP up to about 295 s, then **200** or **202** + `poll_url` |\n| **Polling** | `GET /job/get/{job_id}` after **202** or when work exceeds the hold |\n| **Queue priority** | Optional `priority` — omit for plan default; see **Introduction & Basics → Guides** |\n\nCredit amounts are **not** duplicated here — use **`GET /job/pricelist`** or `_billing` on responses.","item":[{"name":"Run whitepage scan analysis","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/pdfstudio___whitepage_scan","host":["{{base_url}}"],"path":["job","add","pdfstudio___whitepage_scan"]},"description":"## Overview\nScan PDFs or images for blank pages and embedded barcodes/QR codes. Canonical whitepage endpoint — uses the PaperOffice workflow pipeline.\n\n## Request parameters\n**Pipeline:** `pdfstudio___whitepage_scan` (fixed, do not change the URL path)\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"whitepage_threshold","type":"text","description":"Whitespace threshold 0.0-1.0, default: 0.95 | Type: string","value":"","disabled":true},{"key":"detect_code","type":"text","description":"Detect barcodes and QR codes | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Compliance: Activate WORM (300 Credits)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/document-retention-activate","host":["{{base_url}}"],"path":["documents","document-retention-activate"]},"description":"Activates WORM protection (write-once-read-many) for a document. The document becomes immutable for the configured retention period (`retention_years`); deletion is only possible after expiry.\n\n---\n**API reference:** `po-compliance-activate-worm` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 300 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"pofid\": \"{{pofid}}\",\n    \"anchor_mode\": \"immediate\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Create document folder","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/folder-create","host":["{{base_url}}"],"path":["documents","folder-create"]},"description":"## Overview\nBundle **at least two existing documents** (POFIDs) into a stapled folder/heft in the Headless DMS. This is not an empty directory create — it links documents that already exist.\n\n## Request parameters\nRequired: `pofids` (array, min. 2). Optional: `folder_name`, `folder_type` (`staple` or `binder`), `folder_description`, `parent_pofid`.\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-folders-create` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"pofids\": [\n        \"{{pofid}}\",\n        \"{{pofid_2}}\"\n    ],\n    \"folder_type\": \"staple\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Dissolve (unstaple) folder","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/folder-dissolve","host":["{{base_url}}"],"path":["documents","folder-dissolve"]},"description":"## Overview\nDissolve a folder and optionally relocate contained documents. Use for cleanup and restructuring workspace trees.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-folders-dissolve` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"folder_id","type":"text","description":"Document folder ID. Alternative to `pofid` when dissolving by folder. | Type: string","value":"","disabled":true},{"key":"pofid","type":"text","description":"**REQUIRED** | POFID of a document in the folder (`.podf` map). Alternative to `folder_id`. | Type: string","value":"{{pofid}}"},{"key":"confirm","type":"text","description":"**REQUIRED** | Must be true to confirm this destructive action. | Type: boolean","value":"true"}]}},"response":[]},{"name":"Export document list","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/documents-export","host":["{{base_url}}"],"path":["documents","documents-export"]},"description":"## Overview\nExport Documents Bulk export documents as ZIP archive. Options: - Specific POFIDs - All from workspace\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-document-lists-documents-export` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"selected_pofids\": [\n        \"{{pofid}}\",\n        \"{{pofid_2}}\"\n    ],\n    \"export_format\": \"excel\",\n    \"selected_fields\": [\n        \"document_date\"\n    ],\n    \"include_original_files\": false,\n    \"include_ocr_text\": false,\n    \"include_ocr_bounding_boxes\": false,\n    \"archive_format\": \"zip\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"List folders","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/folder-list","host":["{{base_url}}"],"path":["documents","folder-list"]},"description":"## Overview\nList folders in a workspace with optional parent filter and pagination.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-folders-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"workspace_id","type":"text","description":"**REQUIRED** | Required: Workspace ID to list folders from | Type: string","value":"{{workspace_id}}"}]}},"response":[]},{"name":"Run DMS document analysis","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-analysis","host":["{{base_url}}"],"path":["documents","document-analysis"]},"description":"## Overview\nRun AI document analysis on a document (summary, classification, extraction hints).\n\n**Model parameter:** common values include `basic`, `premium`, and `ultra`. The API also accepts extended agent and pro variants (e.g. `agent-premium`, `premium-pro-max`, `paperoffice-agent-ultra`) — see the error message for the full runtime list when an invalid model is sent.\n\n---\n**API reference:** `po-document-analysis-analysis-dms` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | AI analysis tier: basic, premium, or ultra (default ultra). | Type: string","value":"ultra"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"document_analysis"},{"key":"idp_fields","type":"text","description":"OPTIONAL: Extra fields as JSON array | Type: string","value":"","disabled":true},{"key":"priority","type":"text","description":"Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer | Max: 900 | Example: 100","value":"","disabled":true}]}},"response":[]},{"name":"Suggest AI Model","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/suggest-llm-model","host":["{{base_url}}"],"path":["documents","suggest-llm-model"]},"description":"## Overview\nSuggest an LLM model tier for a document based on content complexity.\n\nReturns a recommended model from the same family as `document-analysis` (basic/premium/ultra and extended agent/pro variants).\n\n---\n**API reference:** `po-document-analysis-suggest-llm-model` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"file_1","type":"file","description":"**REQUIRED** | Multipart file upload (PDF or image). At least one document input is required. | Type: file","src":null},{"key":"model","type":"text","description":"**REQUIRED** | LLM tier for field suggestions: basic, premium, or ultra (default premium). | Type: string","value":"premium"},{"key":"idp_collection","type":"text","description":"IDP collection slug for workflow discrimination (e.g. invoice, receipt, bank_check). | Type: string","value":"suggest_paperoffice_ai_model"},{"key":"prompt","type":"text","description":"**REQUIRED** | Natural-language description of fields to extract (guides model selection). | Type: string","value":"I want to extract invoice number, date, vendor name, and total amount"},{"key":"priority","type":"text","description":"Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer | Max: 900 | Example: 100","value":"","disabled":true}]}},"response":[]},{"name":"Update folder","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/folder-update","host":["{{base_url}}"],"path":["documents","folder-update"]},"description":"## Overview\nUpdate folder name, parent, or metadata for an existing DMS folder.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-folders-update` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"folder_id","type":"text","description":"**REQUIRED** | ID of the document folder to update. | Type: string","value":"1"},{"key":"folder_name","type":"text","description":"New name for the document folder. | Type: string","value":"","disabled":true},{"key":"folder_description","type":"text","description":"New description for the document folder. | Type: string","value":"","disabled":true},{"key":"folder_icon","type":"text","description":"New icon for the document folder (emoji or icon key). | Type: string","value":"","disabled":true},{"key":"folder_color","type":"text","description":"New color for the document folder (hex code, e.g. `#3b82f6`). | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Acquire Edit-Session (Presence-Lock)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-edit-session-acquire/{{pofid}}","host":["{{base_url}}"],"path":["documents","document-edit-session-acquire","{{pofid}}"],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nAcquire a cooperative metadata edit lock for a document. If another user is editing, the response returns `status=readonly`. The lock is ephemeral — it expires after about 60 seconds without a heartbeat. Poll **`POST /documents/document-edit-session-heartbeat/{pofid}`** while editing.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-edit-session-acquire` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | PaperOffice document ID (pofid) — URL path parameter or request body. | Type: string","value":"{{pofid}}"}]}},"response":[]},{"name":"Create Document from Content","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/document_generation/create-from-content","host":["{{base_url}}"],"path":["document_generation","create-from-content"]},"description":"## Overview\nGenerate a PDF in the DMS from Markdown or HTML.\n\n**Required body field:** `content` (Markdown or HTML string). Set `content_type` to `markdown` or `html`.\n\nThis endpoint does **not** use `html_content` — that field name applies only to `POST /document_generation/template-create`.\n\n**HTTP status:** Returns **201 Created** on success (also accept **200** in clients).\n\n---\n**API reference:** `po-documents-create-from-content` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"content\": \"Sample content\",\n    \"content_type\": \"markdown\",\n    \"output_format\": \"pdf\",\n    \"workspace_id\": \"{{workspace_id}}\",\n    \"language\": \"de\",\n    \"auto_classify\": false,\n    \"priority\": 100\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Create Document from Template","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/document_generation/create-from-template","host":["{{base_url}}"],"path":["document_generation","create-from-template"]},"description":"## Overview\nCreate a new document in a workspace from a document generation template.\n\nRequires `template_id`, `workspace_id`, and template variable values as documented in the template schema.\n\n**HTTP status:** Returns **201 Created** on success (also accept **200** in clients).\n\n---\n**API reference:** `po-documents-create-from-template` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"template_id\": \"{{template_id}}\",\n    \"variables\": {},\n    \"output_format\": \"pdf\",\n    \"workspace_id\": \"{{workspace_id}}\",\n    \"auto_classify\": false,\n    \"priority\": 100\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Create Document Template","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/document_generation/template-create","host":["{{base_url}}"],"path":["document_generation","template-create"]},"description":"## Overview\nCreate a reusable document-generation template.\n\n**HTML field:** use `html_content` (not `content`). Merge placeholders such as `{{invoice_number}}` and `{{customer_name}}` are supported.\n\n**HTTP status:** Returns **201 Created** on success (also accept **200** in clients).\n\n---\n**API reference:** `po-templates-create` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)\n\n`{{…}}` in `html_content` are literal template merge fields, not Postman variables.","body":{"mode":"raw","raw":"{\n    \"name\": \"Example template {{$timestamp}}\",\n    \"html_content\": \"<h1>Invoice {{invoice_number}}</h1><p>Customer: {{customer_name}}</p>\",\n    \"category\": \"general\",\n    \"page_format\": \"A4\",\n    \"page_orientation\": \"portrait\",\n    \"margin_top\": 20,\n    \"margin_right\": 15,\n    \"margin_bottom\": 20,\n    \"margin_left\": 15\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Create document type","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/document-types-create","host":["{{base_url}}"],"path":["documents","document-types-create"]},"description":"Creates a custom document type (including `retention_years` and `retention_mode`).\n\n---\n**API reference:** `po-documents-document-types-create` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"name\": \"Example name {{$timestamp}}\",\n    \"source_locale\": \"en\",\n    \"retention_mode\": \"none\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Delete Document Template","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/document_generation/template-delete","host":["{{base_url}}"],"path":["document_generation","template-delete"]},"description":"## Overview\nDelete a document generation template by ID.\n\nSend `template_id` in the JSON body. Legacy aliases `id` and `template` are accepted but deprecated.\n\n---\n**API reference:** `po-templates-delete` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"template_id\": \"{{template_id}}\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Delete document type","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/document-types-delete","host":["{{base_url}}"],"path":["documents","document-types-delete"]},"description":"Deletes a custom document type (only when no documents and no workspace default reference it). Requires `id` and `confirm: true`.\n\n---\n**API reference:** `po-documents-document-types-delete` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"id\": \"{{type_id}}\",\n    \"confirm\": true\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Document: Automation history","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/automation-timeline/{{pofid}}","host":["{{base_url}}"],"path":["documents","automation-timeline","{{pofid}}"],"query":[{"key":"share_context","value":"","description":"Optional share context for sub-users | Type: string","disabled":true}],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nReturns the chronological automation history for a document (AI-DMS, IDP Agent, Workflow).\n\nEvents include pipeline type, status, timestamps, and human-readable labels. Requires read access in the document workspace.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-automation-timeline` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 0 credits (base, at `priority=500`)"},"response":[]},{"name":"Download document","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-download/{{pofid}}","host":["{{base_url}}"],"path":["documents","document-download","{{pofid}}"],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nDownload the original file of a document as a **binary HTTP attachment** (`Content-Disposition: attachment`).\n\nPass `pofid` as a path segment (`GET /documents/document-download/{pofid}`) or query parameter (`?pofid=`). The response body is the raw file bytes — not a JSON wrapper with `download_url`.\n\nFor time-limited URLs (jobs, exports), use `GET /job/download/{token}` instead.\n\n## Request parameters\n| Parameter | Required | Description |\n|---|---|---|\n| `pofid` | Yes | PaperOffice File ID |\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-download` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"Download document audit report PDF","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/audit-report-pdf","host":["{{base_url}}"],"path":["documents","audit-report-pdf"]},"description":"Generates a printable PDF security audit report for a document (AI-DMS Ultra). Allowed during audit quarantine for external review. Optionally appends the original document as a combined PDF.\n\n---\n**API reference:** `po-documents-audit-report-pdf` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | Document POFID | Type: string","value":"{{pofid}}"},{"key":"language","type":"text","description":"ISO-639-1 UI language for PDF labels (default en) | Type: string","value":"","disabled":true},{"key":"include_original","type":"text","description":"Append original document as PDF appendix | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Find similar documents","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-similar-find?pofid={{pofid}}","host":["{{base_url}}"],"path":["documents","document-similar-find"],"query":[{"key":"documents_id","value":"","description":"**ONE OF REQUIRED** | Numeric document ID of the reference document. At least one of documents_id or pofid MUST be provided. | Type: number","disabled":true},{"key":"pofid","value":"{{pofid}}","description":"**ONE OF REQUIRED** | POFID of the reference document (resolved to documents_id). At least one of documents_id or pofid MUST be provided. | Type: string"},{"key":"threshold","value":"","description":"Similarity threshold 0.0-1.0 (default: 0.7 = 70%) | Type: number","disabled":true},{"key":"limit","value":"","description":"Max results 1-50 (default: 10) | Type: number","disabled":true}]},"description":"## Overview\nFind documents similar to a reference document using AI embeddings. Requires AI-DMS processing (basic+ tier) on the reference document — unprocessed documents have no embeddings. Use for duplicate detection, finding related invoices or contracts.\n\n## Request parameters\n#### Required alternatives\n\nProvide **at least one** of: `documents_id` **or** `pofid`.\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-similar-find` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Get DMS statistics","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/stats?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["documents","stats"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"Statistics for a specific workspace only | Type: number","disabled":true}]},"description":"Get global DMS statistics — total documents, entities, embeddings, breakdown by document type, and optional workspace filter. Best-effort counts for overview dashboards.\n\n---\n**API reference:** `po-documents-stats-get` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"Get document audit trail","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-audit-trail?pofid={{pofid}}","host":["{{base_url}}"],"path":["documents","document-audit-trail"],"query":[{"key":"pofid","value":"{{pofid}}","description":"**ONE OF REQUIRED** | Filter by document POFID — resolved to documents_id automatically. Alternative to documents_id. | Type: string"},{"key":"documents_id","value":"","description":"**ONE OF REQUIRED** | Only show changes for this document (numeric ID) | Type: string|number","disabled":true},{"key":"user_id","value":"","description":"Only show changes from this user | Type: string|number","disabled":true},{"key":"action","value":"","description":"Filter by action type. Common values: document_created, field_changed, field_created, status_changed, document_deleted_soft, document_checked_out, document_checked_in, folder_created, folder_dissolved. Server validates against actual recorded actions. | Type: string","disabled":true},{"key":"limit","value":"","description":"Maximum number of entries (default: 50) | Type: number","disabled":true},{"key":"offset","value":"","description":"Offset for pagination (default: 0) | Type: number","disabled":true}]},"description":"## Overview\nGet compliance audit trail — who changed what, when. Filter by document (pofid or documents_id), user, action. For compliance audits (GoBD, GDPR/DSGVO).\n\n## Request parameters\n#### Required alternatives\n\nProvide **at least one** of: `documents_id` **or** `pofid`.\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-audit-trail-get` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Get Document Template","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/document_generation/template-get","host":["{{base_url}}"],"path":["document_generation","template-get"]},"description":"## Overview\nRetrieve a single document generation template by ID.\n\n## Parameters\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `template_id` | Yes | Template ID in `tpl_…` format (from `POST /document_generation/templates-list`) |\n\nLegacy aliases `id` and `template` are accepted but deprecated — use `template_id`.\n\n---\n**API reference:** `po-templates-get` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"template_id\": \"{{template_id}}\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Get document thumbnail","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-thumb-get/{{pofid}}/{{page_number}}","host":["{{base_url}}"],"path":["documents","document-thumb-get","{{pofid}}","{{page_number}}"],"query":[{"key":"documents_id","value":"","description":"**ONE OF REQUIRED** | Numeric document ID — alternative to pofid. | Type: number","disabled":true}],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."},{"key":"page_number","value":"1","description":"1-based page number for thumb/OCR endpoints."}]},"description":"## Overview\nGet a thumbnail preview image of a specific document page. Returns base64-encoded WebP/JPEG image. Accepts pofid or documents_id. Use for document preview, visual comparison, page inspection.\n\n## Request parameters\n#### Required alternatives\n\nProvide **at least one** of: `documents_id` **or** `pofid`.\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-thumbnail-get` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Heartbeat Edit-Session","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-edit-session-heartbeat/{{pofid}}","host":["{{base_url}}"],"path":["documents","document-edit-session-heartbeat","{{pofid}}"],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nKeeps a previously acquired edit-session lock alive. Call every **30 seconds** while editing. Returns **HTTP 409** with `EDIT_SESSION_LOST` if the lock was already released or expired.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-edit-session-heartbeat` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | PaperOffice document ID (pofid) — URL path parameter or request body. | Type: string","value":"{{pofid}}"}]}},"response":[]},{"name":"List Document Templates","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/document_generation/templates-list","host":["{{base_url}}"],"path":["document_generation","templates-list"]},"description":"## Overview\nList document generation templates available in the account with name, format, and last-updated metadata.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-templates-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"limit\": 50,\n    \"offset\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"List document types","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-types-list","host":["{{base_url}}"],"path":["documents","document-types-list"]},"description":"List document types configured for the account, including retention policy per type.\n\n---\n**API reference:** `po-documents-document-types-list` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"List IDP collections","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/idp-collections-list","host":["{{base_url}}"],"path":["documents","idp-collections-list"]},"description":"Catalog of all IDP extraction templates including field definitions.\n\n---\n**API reference:** `po-documents-idp-collections-list` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"List meta fields (index schema)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/meta-fields-list?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["documents","meta-fields-list"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"Optional workspace scope | Type: integer","disabled":true},{"key":"compact","value":"true","description":"MCP only: true (default) returns compact field catalog; false returns full UI export catalog (very large) | Type: boolean","disabled":true},{"key":"locale","value":"","description":"MCP only: label locale for compact output (default en) | Type: string","disabled":true},{"key":"fields_limit","value":"","description":"MCP only: max fields in compact output (default 120, sorted by usage_count) | Type: integer | Min: 1 | Max: 500","disabled":true}]},"description":"List system and custom meta fields for bulk edit/export (workspace index schema).\n\n## Performance\nLarge accounts may need **10–30 seconds**. Use `limit` / `page` query parameters for interactive use (recommended: `limit=10`). This endpoint performs heavy aggregation and is not cached.\n\n---\n**API reference:** `po-documents-meta-fields-list` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"Merge publisher","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/publishers/{{publisher_id}}/merge","host":["{{base_url}}"],"path":["publishers","{{publisher_id}}","merge"],"variable":[{"key":"publisher_id","value":"{{publisher_id}}","description":"Publisher ID from GET /document_intelligence/publishers."}]},"description":"## Overview\nMerge two publisher profiles when duplicates exist. The `{publisher_id}` path segment is the **source** publisher to retire; provide `target_publisher_id` in the JSON body. Logos, aliases, and document references move to the target.\n\n## Request parameters\n## Best practices\n- Requires **publisher administration** permission on the tenant.\n- Changes affect global publisher master data referenced by documents within the scoped workspace(s) you provide.\n\n---\n**API reference:** `po-publishers-merge` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"target_publisher_id","type":"text","description":"**REQUIRED** | ID of the publisher to keep — the source `{publisher_id}` from the URL is merged into this profile. | Type: integer","value":"1"}]}},"response":[]},{"name":"Process document (AI-DMS)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded","description":"API accepts both application/x-www-form-urlencoded and multipart/form-data."}],"url":{"raw":"{{base_url}}/documents/document-process/{{pofid}}","host":["{{base_url}}"],"path":["documents","document-process","{{pofid}}"],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"Trigger AI-DMS processing on a document that is already stored in PaperOffice. Use when a document was uploaded without AI-DMS or when re-processing with a different tier. Queues OCR, classification, and metadata extraction; previous analysis results are reset on re-process. This does not upload a file — the document must already exist. Upload new files via **Upload document** (`PUT /documents/document-put/{pofid}`) in Headless DMS first.\n\nTier downgrade or same-tier reprocess requires confirm_tier_downgrade=true and/or confirm_reprocess=true (HTTP 409 otherwise). Upgrades need no extra confirmation.\n\n#### Required alternatives\n\nProvide **at least one** of: `documents_id` **or** `pofid`.\n\n---\n**API reference:** `po-documents-process` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"ai_dms_tier\": \"basic\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Query Edit-Session Status","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-edit-session-status/{{pofid}}","host":["{{base_url}}"],"path":["documents","document-edit-session-status","{{pofid}}"],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nGet the current edit-session status for a document (`free`, `mine`, or `taken`) without acquiring the lock. Use before **`POST /documents/document-edit-session-acquire/{pofid}`** to avoid unnecessary lock attempts.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-edit-session-status` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Release Edit-Session","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-edit-session-release/{{pofid}}","host":["{{base_url}}"],"path":["documents","document-edit-session-release","{{pofid}}"],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nReleases the edit-session lock for a document so other users can edit. Call when the user finishes editing or navigates away.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-edit-session-release` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 0 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | PaperOffice document ID (pofid) — URL path parameter or request body. | Type: string","value":"{{pofid}}"}]}},"response":[]},{"name":"Rename publisher","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/publishers/{{publisher_id}}/rename","host":["{{base_url}}"],"path":["publishers","{{publisher_id}}","rename"],"variable":[{"key":"publisher_id","value":"{{publisher_id}}","description":"Publisher ID from GET /document_intelligence/publishers."}]},"description":"## Overview\nRename a publisher profile. The `{publisher_id}` path segment identifies the publisher; provide `new_name` in the JSON body.\n\n## Request parameters\n## Best practices\n- Requires **publisher administration** permission on the tenant.\n- Changes affect global publisher master data referenced by documents within the scoped workspace(s) you provide.\n\n---\n**API reference:** `po-publishers-rename` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"new_name","type":"text","description":"**REQUIRED** | New display name for the publisher identified by `{publisher_id}` in the URL path. | Type: string","value":"Example name"}]}},"response":[]},{"name":"Resolve document POFID","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-pofid-resolve","host":["{{base_url}}"],"path":["documents","document-pofid-resolve"]},"description":"Normalizes a POFID against the database (O/0 hash segment) and returns `documents_id` and `file_name`. Prefer `documents_id` from search for stable access.\n\n---\n**API reference:** `po-documents-pofid-resolve` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | Document POFID (byte-copy from search; O/0 in hash is normalized) | Type: string","value":"{{pofid}}"},{"key":"include_deleted","type":"text","description":"Include soft-deleted documents | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Run IDP Agent on document","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/idp-agent-run","host":["{{base_url}}"],"path":["documents","idp-agent-run"]},"description":"Run IDP extraction via agent — upload a document or pass `pofid`; optionally wait for the result in the same request.\n\n**Agent IDs:** There is no public REST list endpoint for processing-agent IDs. Obtain `idp_agent_id` from the PaperOffice app UI or MCP tools (`po_agents_list` / workspace agent settings) before calling this endpoint.\n\n#### Required alternatives\n\nProvide **at least one** of: `file_url` **or** `pofid` **or** `upload_id`.\n\nProvide **at least one** of: `workspace_id` **or** `workspace_name`.\n\n---\n**API reference:** `po-documents-idp-agent-run` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"formdata","formdata":[{"key":"idp_agent_id","type":"text","description":"**REQUIRED** | IDP Agent ID from po_agents_list (kind idp_extract) | Type: string","value":"1"},{"key":"pofid","type":"text","description":"**ONE OF REQUIRED** | PaperOffice document ID (POFID) to process. | Type: string","value":"{{pofid}}"},{"key":"upload_id","type":"text","description":"**ONE OF REQUIRED** | Staging upload ID from a prior upload step. | Type: string","value":"","disabled":true},{"key":"file_url","type":"text","description":"**ONE OF REQUIRED** | Remote file URL to process (alternative to POFID/upload). | Type: string","value":"","disabled":true},{"key":"file_name","type":"text","description":"Original filename hint when using file_url. | Type: string","value":"","disabled":true},{"key":"workspace_id","type":"text","description":"**ONE OF REQUIRED** | Target workspace ID (required unless workspace_name is set). | Type: integer","value":"","disabled":true},{"key":"workspace_name","type":"text","description":"**ONE OF REQUIRED** | Target workspace name (creates workspace if missing). | Type: string","value":"My Workspace"},{"key":"client_wait","type":"text","description":"When true, block until the agent run completes (sync mode). | Type: boolean","value":"","disabled":true},{"key":"wait_timeout_sec","type":"text","description":"Maximum seconds to wait when client_wait=true (default 300). | Type: integer","value":"","disabled":true},{"key":"poll_interval_sec","type":"text","description":"Poll interval in seconds when client_wait=true (default 5). | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"Run Split Agent on document","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/split-agent-run","host":["{{base_url}}"],"path":["documents","split-agent-run"]},"description":"## Overview\nOptionally upload a PDF (or pass `pofid`), assign a split agent, and return a type-specific split result.\n**Agent IDs:** There is no public REST list endpoint for processing-agent IDs. Obtain `idp_agent_id` / `split_agent_id` / `trust_agent_id` from the PaperOffice app UI or MCP tools (`po_agents_list` / workspace agent settings) before calling this endpoint.\n\n#### Required alternatives\n\nProvide **at least one** of: `file_url` **or** `pofid` **or** `upload_id`.\n\nProvide **at least one** of: `workspace_id` **or** `workspace_name`.\n\n---\n**API reference:** `po-documents-split-agent-run` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"formdata","formdata":[{"key":"split_agent_id","type":"text","description":"**REQUIRED** | Split Agent ID from po_agents_list (kind pdf_split) | Type: string","value":"1"},{"key":"pofid","type":"text","description":"**ONE OF REQUIRED** | Existing PDF in DMS (alternative to upload_id/file_url) | Type: string","value":"{{pofid}}"},{"key":"upload_id","type":"text","description":"**ONE OF REQUIRED** | From po_documents_upload_url_get after curl upload | Type: string","value":"","disabled":true},{"key":"file_url","type":"text","description":"**ONE OF REQUIRED** | Public HTTPS URL to PDF | Type: string","value":"","disabled":true},{"key":"file_name","type":"text","description":"Filename hint when using upload_id or file_url | Type: string","value":"","disabled":true},{"key":"workspace_id","type":"text","description":"**ONE OF REQUIRED** | Target workspace when uploading a new PDF | Type: integer","value":"","disabled":true},{"key":"workspace_name","type":"text","description":"**ONE OF REQUIRED** | Auto-create workspace by name when uploading | Type: string","value":"My Workspace"},{"key":"client_wait","type":"text","description":"Wait server-side for pipeline completion | Type: boolean","value":"","disabled":true},{"key":"wait_timeout_sec","type":"text","description":"Maximum seconds to wait when client_wait=true (default 300). | Type: integer","value":"","disabled":true},{"key":"poll_interval_sec","type":"text","description":"Poll interval in seconds when client_wait=true (default 5). | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"Run Trust Agent on document","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/trust-agent-run","host":["{{base_url}}"],"path":["documents","trust-agent-run"]},"description":"## Overview\nPDF integrity check via Trust Agent — upload a file or pass `pofid`; optional wait for the finished result.\n**Agent IDs:** There is no public REST list endpoint for processing-agent IDs. Obtain `idp_agent_id` / `split_agent_id` / `trust_agent_id` from the PaperOffice app UI or MCP tools (`po_agents_list` / workspace agent settings) before calling this endpoint.\n\n#### Required alternatives\n\nProvide **at least one** of: `file_url` **or** `pofid` **or** `upload_id`.\n\n---\n**API reference:** `po-documents-trust-agent-run` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"formdata","formdata":[{"key":"trust_agent_id","type":"text","description":"**REQUIRED** | Trust Agent ID from po_agents_list (kind pdf_trust) | Type: string","value":"1"},{"key":"pofid","type":"text","description":"**ONE OF REQUIRED** | PaperOffice document ID (POFID) to process. | Type: string","value":"{{pofid}}"},{"key":"upload_id","type":"text","description":"**ONE OF REQUIRED** | Staging upload ID from a prior upload step. | Type: string","value":"","disabled":true},{"key":"file_url","type":"text","description":"**ONE OF REQUIRED** | Remote file URL to process (alternative to POFID/upload). | Type: string","value":"","disabled":true},{"key":"file_name","type":"text","description":"Original filename hint when using file_url. | Type: string","value":"","disabled":true},{"key":"workspace_id","type":"text","description":"Target workspace ID (required unless workspace_name is set). | Type: integer","value":"{{workspace_id}}","disabled":true},{"key":"client_wait","type":"text","description":"When true, block until the agent run completes (sync mode). | Type: boolean","value":"","disabled":true},{"key":"wait_timeout_sec","type":"text","description":"Maximum seconds to wait when client_wait=true (default 300). | Type: integer","value":"","disabled":true},{"key":"poll_interval_sec","type":"text","description":"Poll interval in seconds when client_wait=true (default 5). | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"Search documents (advanced)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/documents-list","host":["{{base_url}}"],"path":["documents","documents-list"]},"description":"## Overview\nAdvanced multi-source document search **within the workspace you provide** (`workspace_id` is required).\n\nCombines full-text search, OCR text, entity matching, and semantic embeddings. Supports intelligent query mode detection, pagination, workspace filters, and relevance scoring.\n\nThis endpoint does **not** search across all workspaces — pass the target `workspace_id` (or filter list) explicitly.\n\n## Request parameters\n## Best practices\n- Use workspace, folder, and filter parameters from the parameter table — not a single document `pofid` unless filtering to one document.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-documents-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"workspace_id","type":"text","description":"**REQUIRED** | Required: ID of the workspace | Type: integer","value":"{{workspace_id}}"},{"key":"global_search","type":"text","description":"Search term for multi-source document search (fulltext, OCR, entities, semantic). | Type: string","value":"","disabled":true},{"key":"search_mode","type":"text","description":"Search mode: `intelligent` (auto), `hybrid`, `semantic`, `fulltext`, or `exact`. | Type: string | Allowed: intelligent, hybrid, semantic, fulltext","value":"","disabled":true},{"key":"search_preference","type":"text","description":"keyword=BM25 only; semantic=vector search; balanced=blend both (default). | Type: string | Allowed: keyword, semantic, balanced","value":"","disabled":true},{"key":"search_scope","type":"text","description":"current=search only the active workspace; all=search all accessible workspaces. | Type: string | Allowed: current, all","value":"","disabled":true},{"key":"similarity_threshold","type":"text","description":"Minimum Similarity for Semantic Search (0.0-1.0) | Type: number","value":"","disabled":true},{"key":"page","type":"text","description":"Page number for pagination | Type: integer","value":"","disabled":true},{"key":"limit","type":"text","description":"documents per page (max 500) | Type: integer | Max: 500","value":"","disabled":true},{"key":"sort","type":"text","description":"Sort field (e.g. created_at, updated_at, title). | Type: string","value":"","disabled":true},{"key":"order","type":"text","description":"Sort direction for listed documents: ASC or DESC (default DESC). | Type: string | Allowed: ASC, DESC","value":"","disabled":true},{"key":"__document__data__classification__document_type","type":"text","description":"Filter: Documenttypen (JSON Array or komma-separiert) | Type: array","value":"","disabled":true},{"key":"__document__content__extraction__keywords","type":"text","description":"Filter: Keywords | Type: array","value":"","disabled":true},{"key":"__document__data__workflow__state","type":"text","description":"Filter: Workflow-Status | Type: array","value":"","disabled":true},{"key":"__document__data__classification__locale","type":"text","description":"Filter: language/Locale | Type: array","value":"","disabled":true},{"key":"__document__data__metadata__save_paths","type":"text","description":"Filter by storage path (PREFIX_WILDCARD:/path or EXACT:/path). | Type: array","value":"","disabled":true},{"key":"ai_dms_status","type":"text","description":"Filter: AI-DMS Tier | Type: array","value":"","disabled":true},{"key":"ai_agent_status","type":"text","description":"Filter: AI-Agent Status | Type: array","value":"","disabled":true},{"key":"date_from","type":"text","description":"Filter: Date from (YYYY-MM-DD) | Type: string","value":"","disabled":true},{"key":"date_to","type":"text","description":"Filter: date bis (YYYY-MM-DD) | Type: string","value":"","disabled":true},{"key":"share_context","type":"text","description":"External share context token JSON for scoped access in a shared workspace. | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Update Document Template","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/document_generation/template-update","host":["{{base_url}}"],"path":["document_generation","template-update"]},"description":"## Overview\nUpdate an existing document generation template (HTML content, metadata, variables schema).\n\nSend `template_id` in the JSON body. Legacy aliases `id` and `template` are accepted but deprecated.\n\n---\n**API reference:** `po-templates-update` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"template_id\": \"{{template_id}}\",\n    \"page_orientation\": \"portrait\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Update document type","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/document-types-update","host":["{{base_url}}"],"path":["documents","document-types-update"]},"description":"## Overview\nUpdate a custom document type (`is_system_default = 0` only). Requires `id` or `type_key`.\n\n**Fields:** `name_default`, `description_default` (alias `description`), `retention_years`, `retention_mode`, `icon`, `color`, `jurisdiction`, `legal_basis`.\n\n---\n**API reference:** `po-documents-document-types-update` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"id\": \"{{type_id}}\",\n    \"retention_mode\": \"none\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Workspace: Classical IDP readiness","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/workspace-classical-idp-readiness","host":["{{base_url}}"],"path":["documents","workspace-classical-idp-readiness"]},"description":"Bewertet den klassischen IDP-Workflow eines Workspaces (AI-DMS, Typ AUTO, Pipeline, Plattformstufen).\n\n---\n**API reference:** `po-documents-workspace-classical-idp-readiness` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"workspace_id","type":"text","description":"**REQUIRED** | Workspace ID (required). | Type: integer","value":"{{workspace_id}}"},{"key":"ai_dms_mode","type":"text","description":"Optional unsaved preview of AI-DMS mode. | Type: string","value":"","disabled":true},{"key":"default_document_type_mode","type":"text","description":"Optional preview: none|auto|fixed. | Type: string","value":"","disabled":true},{"key":"workspace_tier","type":"text","description":"Optional preview tier (standard|business|compliance). | Type: string","value":"","disabled":true},{"key":"workspace_idp_agent_pipeline","type":"text","description":"Optional preview of workspace IDP pipeline entries. | Type: array","value":"","disabled":true}]}},"response":[]},{"name":"Get entity statistics","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/entity-statistics?entity_value=Acme%20GmbH","host":["{{base_url}}"],"path":["documents","entity-statistics"],"query":[{"key":"entity_value","value":"Acme GmbH","description":"**REQUIRED** | Entity value (e.g. company name, IBAN, person name) | Type: string"},{"key":"entity_type","value":"","description":"Filter type: company, person, iban, tax_id, amount, address, email, phone | Type: string","disabled":true}]},"description":"## Overview\nGet detailed statistics for a specific entity (company, person, IBAN) — which documents mention it, total amounts, time range. Use for: \"How much did we order from company X?\".\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-entities-stats-get` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Get document revisions","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-revisions?pofid={{pofid}}","host":["{{base_url}}"],"path":["documents","document-revisions"],"query":[{"key":"pofid","value":"{{pofid}}","description":"**REQUIRED** | PaperOffice-Document ID, for the revisions should be retrieved. Passed as URL parameter. | Type: string"},{"key":"limit","value":"","description":"Maximum number of revisions returned. | Type: integer | Min: 1 | Max: 500","disabled":true},{"key":"offset","value":"","description":"Offset for pagination. | Type: integer","disabled":true},{"key":"action","value":"","description":"Filter after Action type (e.g. 'field_changed', 'folder_created'). | Type: string","disabled":true},{"key":"field_key","value":"","description":"Filter by changed field (e.g. 'invoice_number'). | Type: string","disabled":true},{"key":"date_from","value":"","description":"revisions from this date (YYYY-MM-DD). | Type: string","disabled":true},{"key":"date_to","value":"","description":"revisions bis zu this date (YYYY-MM-DD). | Type: string","disabled":true}]},"description":"## Overview\nDocument version history. Displays all changes with timestamp, user, and change details.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-revisions-get-document-revisions` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Add Document Tag","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-tag-add","host":["{{base_url}}"],"path":["documents","document-tag-add"]},"description":"## Overview\nAdd one or more tags to a document. Creates the tag in the workspace if it does not exist yet.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-tags-create` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | PaperOffice File ID | Type: string","value":"{{pofid}}"},{"key":"tag_name","type":"text","description":"**REQUIRED** | Tag-Name (max 100 characters) | Type: string","value":"Example name {{$timestamp}}"},{"key":"tag_color","type":"text","description":"Optional hex color (#RGB or #RRGGBB format, e.g. #FF0000). Invalid formats will be rejected. | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Batch-process documents (AI-DMS)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/document-batch-process","host":["{{base_url}}"],"path":["documents","document-batch-process"]},"description":"## Overview\nTriggers AI-DMS processing for multiple documents simultaneously. Max 50 POFIDs per batch. Each document is processed asynchronously via OCR, Entity Extraction, Classification, etc.\n\n## Request parameters\nSee the **Params** / **Body** tab for required fields. Authenticate with your Bearer token. **HTTP:** `POST /documents/document-batch-process`\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-batch-process` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"pofids\": [\n        \"{{pofid}}\",\n        \"{{pofid_2}}\"\n    ],\n    \"ai_dms_tier\": \"basic\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Check for duplicate documents","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/duplicate-check","host":["{{base_url}}"],"path":["documents","duplicate-check"]},"description":"## Overview\nCheck whether similar documents already exist before upload. Compares fingerprints and metadata to reduce duplicate imports.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-duplicate-check` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"file_hash\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n    \"workspace_id\": \"{{workspace_id}}\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Copy document","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-copy","host":["{{base_url}}"],"path":["documents","document-copy"]},"description":"## Overview\nCopy a document to another folder or workspace. Preserves metadata where configured; returns the new document POFID.\n\n## Request parameters\n**Chaining:** On success read ``copy.pofid` for the duplicated document` from the response for the next API call.\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-copy` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | PaperOffice File ID of the document to copy | Type: string","value":"{{pofid}}"},{"key":"target_workspace_id","type":"text","description":"**REQUIRED** | ID of the target workspace, where the document should be copied to | Type: integer","value":"{{workspace_id}}"},{"key":"locale","type":"text","description":"Optional locale for copied metadata labels (e.g. de-DE). | Type: string","value":"","disabled":true},{"key":"new_file_name","type":"text","description":"Destination filename after copy (include extension). | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Create Document Comment","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-comment-create","host":["{{base_url}}"],"path":["documents","document-comment-create"]},"description":"## Overview\nCreate a comment on a document. Supports optional parent comment ID for threaded replies and @mentions within the workspace.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-comments-create` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | PaperOffice File ID | Type: string","value":"{{pofid}}"},{"key":"content","type":"text","description":"**REQUIRED** | Comment text (required). | Type: string","value":"Sample content"},{"key":"parent_id","type":"text","description":"Parent comment ID for reply (optional) | Type: integer","value":"","disabled":true},{"key":"page_number","type":"text","description":"Page number (optional). | Type: integer | Min: 1","value":"","disabled":true},{"key":"anchor_text","type":"text","description":"Anchor text in the document (optional). | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Create Document Note","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-note-create","host":["{{base_url}}"],"path":["documents","document-note-create"]},"description":"## Overview\nCreate an internal note attached to a document. Notes are visible to workspace users with document access (not external signers).\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-notes-create` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | PaperOffice File ID | Type: string","value":"{{pofid}}"},{"key":"content","type":"text","description":"**REQUIRED** | Note content (required). | Type: string","value":"Sample content"},{"key":"title","type":"text","description":"Optional title. | Type: string","value":"","disabled":true},{"key":"category","type":"text","description":"Category (default: general). | Type: string | Allowed: general, review, legal, technical, financial, internal","value":"","disabled":true},{"key":"is_pinned","type":"text","description":"Pin note to top (0 = no, 1 = yes, default: 0) | Type: integer | Allowed: 0, 1","value":"","disabled":true},{"key":"is_private","type":"text","description":"Private note visible only to you (0 = no, 1 = yes, default: 0) | Type: integer | Allowed: 0, 1","value":"","disabled":true}]}},"response":[]},{"name":"Delete document","request":{"method":"DELETE","header":[],"url":{"raw":"{{base_url}}/documents/document-delete?pofid={{pofid}}","host":["{{base_url}}"],"path":["documents","document-delete"],"query":[{"key":"pofid","value":"{{pofid}}","description":"**REQUIRED** | PaperOffice File ID | Type: string"},{"key":"share_context","value":"","description":"External share context token JSON for scoped access in a shared workspace. | Type: string","disabled":true},{"key":"mode","value":"","description":"Deletion mode: `trash` (soft delete when trash enabled) or `instant` (permanent; requires confirm:true). | Type: string | Allowed: trash, instant","disabled":true},{"key":"confirm","value":"","description":"Required for bulk delete (>5 POFIDs) or mode=instant. | Type: boolean","disabled":true}]},"description":"## Overview\nMove a document to trash or permanently delete when trash retention allows. Requires delete permission on the document.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-delete` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Delete Document Comment","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-comment-delete","host":["{{base_url}}"],"path":["documents","document-comment-delete"]},"description":"## Overview\nDelete a document comment by comment ID. Requires permission to edit the document or ownership of the comment.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-comments-delete` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"comment_id","type":"text","description":"**REQUIRED** | ID of the comment to delete | Type: integer","value":"{{comment_id}}"}]}},"response":[]},{"name":"Delete Document Note","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-note-delete","host":["{{base_url}}"],"path":["documents","document-note-delete"]},"description":"## Overview\nDelete an internal document note by note ID.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-notes-delete` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"note_id","type":"text","description":"**REQUIRED** | ID of the note to delete | Type: integer","value":"{{note_id}}"}]}},"response":[]},{"name":"Edit document fields","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/document-edit/{{pofid}}","host":["{{base_url}}"],"path":["documents","document-edit","{{pofid}}"],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nEdit document metadata fields (title, dates, custom IDP fields) for a document identified by POFID in the URL path.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-edit` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"fields\": {\n        \"document_type\": \"invoice\"\n    }\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Get document details","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-get/{{pofid}}","host":["{{base_url}}"],"path":["documents","document-get","{{pofid}}"],"query":[{"key":"share_context","value":"","description":"External share context token JSON for scoped access in a shared workspace. | Type: string","disabled":true}],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"Get full document details by POFID — metadata, workspace, processing status, extracted fields, and download references.\n\n---\n**API reference:** `po-documents-get` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"Get Document Lifecycle","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-lifecycle-get?pofid={{pofid}}","host":["{{base_url}}"],"path":["documents","document-lifecycle-get"],"query":[{"key":"pofid","value":"{{pofid}}","description":"**REQUIRED** | PaperOffice File ID | Type: string"}]},"description":"## Overview\nGet lifecycle state for a document — retention stage, legal hold flags, trash status, and next allowed transitions.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-lifecycle-get` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Get document OCR text","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/ocr-get?pofid={{pofid}}","host":["{{base_url}}"],"path":["documents","ocr-get"],"query":[{"key":"pofid","value":"{{pofid}}","description":"**REQUIRED** | PaperOffice File Document ID | Type: string"},{"key":"locale","value":"","description":"OCR language/locale hint (e.g. de-DE). Omit for auto-detect. | Type: string","disabled":true},{"key":"page","value":"","description":"1-based page number (omit for full-document OCR text). | Type: integer","disabled":true},{"key":"include_bounding_boxes","value":"","description":"When true, include OCR bounding-box coordinates per text block. | Type: boolean","disabled":true},{"key":"format","value":"","description":"Response shape: `json` (structured OCR pages, default) or `text` (plain text without layout). | Type: string | Allowed: json, text | Example: json","disabled":true}]},"description":"## Overview\nReturns the OCR-extracted text of a document. Contains text per page with confidence scoring.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-ocr-get` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Get trash settings","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/trash-settings","host":["{{base_url}}"],"path":["documents","trash-settings"],"query":[{"key":"retention_days","value":"","description":"Optional: set retention period in days before permanent deletion. | Type: integer","disabled":true}]},"description":"## Overview\nGet or update account-wide trash retention settings.\n\n**GET** (no parameters): returns `trash_retention_days`, `trash_enabled`, `delete_mode_effective_default`, `workspace_tier_effective`, and `_capabilities` (derived from the highest workspace tier on the account). Use this before restore/delete flows — on tiers without trash, deletes are permanent.\n\n**POST/GET with `retention_days`:** root administrator only; value must be 1–3650.\n\nPair with `GET /documents/workspaces-list` (`_capabilities.trash_enabled` per workspace).\n\n---\n**API reference:** `po-documents-trash-settings` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"List Deleted Documents (Trash)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/trash-list","host":["{{base_url}}"],"path":["documents","trash-list"]},"description":"## Overview\nDisplays all soft-deleted documents in the trash. Paginated with days_remaining and is_restorable. Optionally filterable by Workspace.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-trash-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"workspace_id","type":"text","description":"Optional: Filter by workspace | Type: integer","value":"{{workspace_id}}","disabled":true},{"key":"page","type":"text","description":"Page number (default: 1) | Type: integer","value":"","disabled":true},{"key":"pro_page","type":"text","description":"Items per page (10-200, default: 50) | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"List Document Comments","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-comments?pofid={{pofid}}","host":["{{base_url}}"],"path":["documents","document-comments"],"query":[{"key":"pofid","value":"{{pofid}}","description":"**REQUIRED** | PaperOffice File ID | Type: string"},{"key":"include_resolved","value":"","description":"Also show resolved comments (default: 0) | Type: string | Allowed: 0, 1","disabled":true},{"key":"page_number","value":"","description":"Only comments for these page (optional) | Type: integer","disabled":true}]},"description":"## Overview\nList comments on a document with author, timestamp, resolution status, and optional thread hierarchy.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-comments-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"List Document Notes","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-notes?pofid={{pofid}}","host":["{{base_url}}"],"path":["documents","document-notes"],"query":[{"key":"pofid","value":"{{pofid}}","description":"**REQUIRED** | PaperOffice File ID | Type: string"},{"key":"include_private","value":"","description":"Include private notes of OTHER users (default: false). Your own private notes are always visible regardless of this setting. | Type: string | Allowed: 0, 1","disabled":true}]},"description":"## Overview\nList internal notes on a document with author, category, and timestamps.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-notes-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"List Document Tags","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-tags?pofid={{pofid}}","host":["{{base_url}}"],"path":["documents","document-tags"],"query":[{"key":"pofid","value":"{{pofid}}","description":"**REQUIRED** | PaperOffice File ID | Type: string"}]},"description":"## Overview\nList all tags applied to a document with optional color and category metadata.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-tags-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"List Legal Holds","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-legal-holds-list?workspace_id={{workspace_id}}&pofid={{pofid}}","host":["{{base_url}}"],"path":["documents","document-legal-holds-list"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"Workspace ID to filter holds. Omit both workspace_id and pofid to list ALL legal holds account-wide (compliance mode). | Type: integer","disabled":true},{"key":"pofid","value":"{{pofid}}","description":"**REQUIRED** | PaperOffice File ID to filter holds for a specific document. Omit both workspace_id and pofid for account-wide listing. | Type: string"},{"key":"active_only","value":"","description":"Only aktive Holds (default: 1) | Type: string | Allowed: 0, 1","disabled":true}]},"description":"## Overview\nList active legal holds in the account with document references, reason, and hold timestamps. Read-only for auditors with list permission; does not modify holds.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-legal-holds-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Move document","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-move","host":["{{base_url}}"],"path":["documents","document-move"]},"description":"## Overview\nMove a document to another folder within the same workspace or to a permitted target workspace.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-move` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | PaperOffice File ID of the document to move | Type: string","value":"{{pofid}}"},{"key":"target_workspace_id","type":"text","description":"**REQUIRED** | ID of the target workspace, where the document should be moved to | Type: integer","value":"{{workspace_id}}"},{"key":"locale","type":"text","description":"Optional locale for folder/path labels during the move. | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Place legal hold","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/document-legal-hold","host":["{{base_url}}"],"path":["documents","document-legal-hold"]},"description":"Place a legal hold on a document. Requires `pofid` and a `reason` string (audit trail).\n\n---\n**API reference:** `po-documents-legal-holds-create` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"pofid\": \"{{pofid}}\",\n    \"reason\": \"reason_value\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Remove Document Tag","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-tag-remove","host":["{{base_url}}"],"path":["documents","document-tag-remove"]},"description":"## Overview\nRemove a tag from a document without deleting the tag definition from the workspace.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-tags-delete` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | PaperOffice File ID | Type: string","value":"{{pofid}}"},{"key":"tag_name","type":"text","description":"Name of the tag to delete (REQUIRED if tag_id not provided) | Type: string","value":"","disabled":true},{"key":"tag_id","type":"text","description":"ID of the day to delete (REQUIRED if tag_name not provided) | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"Rename document","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-rename","host":["{{base_url}}"],"path":["documents","document-rename"]},"description":"## Overview\nRename a document. The original extension is always preserved. Path separators (/, \\, .) are rejected. Special characters are removed, leading dots are deleted. Maximum length: 255 characters.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-rename` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"pofid","type":"text","description":"**REQUIRED** | Document POFID to rename | Type: string","value":"{{pofid}}"},{"key":"new_file_name","type":"text","description":"**REQUIRED** | New file name (extension preserved if omitted) | Type: string","value":"Example name"}]}},"response":[]},{"name":"Resolve Document Comment","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-comment-resolve","host":["{{base_url}}"],"path":["documents","document-comment-resolve"]},"description":"## Overview\nMark a document comment as resolved. Use after the discussed issue is addressed; resolved comments remain visible in history.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-comments-resolve` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"comment_id","type":"text","description":"**REQUIRED** | Root comment ID (not a reply) | Type: integer","value":"{{comment_id}}"},{"key":"resolved","type":"text","description":"true = as erledigt markieren, false = wieder oeffnen (default: true) | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Restore Document from Trash","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/document-restore","host":["{{base_url}}"],"path":["documents","document-restore"]},"description":"## Overview\nRestore one or more soft-deleted documents from the trash. Also supports document folders (`.podf`).\n\nOnly restorable while `phase=pending` (not permanently deleted).\n\n**Before calling restore:** check `GET /documents/trash-settings` and `GET /documents/workspaces-list` (`_capabilities.trash_enabled`). On tiers without trash, restore returns HTTP `404`.\n\n---\n**API reference:** `po-documents-restore` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"pofid\": \"{{pofid}}\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Search documents (full-text)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/document-search?query=contract&workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["documents","document-search"],"query":[{"key":"query","value":"contract","description":"**REQUIRED** | Search term (full text, semantic vector, or hybrid keyword+vector). | Type: string"},{"key":"workspace_id","value":"{{workspace_id}}","description":"**REQUIRED** | Workspace ID to scope the search (required for single-workspace search). | Type: integer"},{"key":"search_mode","value":"","description":"Search strategy: intelligent (auto), fulltext, semantic, hybrid, or exact field match (exact requires field_key). | Type: string | Allowed: intelligent, fulltext, semantic, hybrid, exact","disabled":true},{"key":"mode","value":"","description":"Legacy alias for search_mode (same values). | Type: string","disabled":true},{"key":"search_scope","value":"","description":"current = only the workspace in workspace_id; all = all workspaces the bearer may access. | Type: string | Allowed: current, all","disabled":true},{"key":"search_preference","value":"","description":"Bias when mode=intelligent: keyword (BM25), semantic (vectors), or balanced (default). | Type: string | Allowed: keyword, semantic, balanced","disabled":true},{"key":"field_key","value":"","description":"Meta-field key for exact mode (required when search_mode=exact). | Type: string","disabled":true},{"key":"limit","value":"","description":"Maximum results (default 20, max 100). | Type: integer","disabled":true},{"key":"page","value":"","description":"1-based page number for paginated results. | Type: integer","disabled":true},{"key":"locale","value":"","description":"Optional locale hint for query normalization (e.g. de:DE). | Type: string","disabled":true},{"key":"workspace_ids","value":"","description":"Explicit list of workspace IDs (alternative to search_scope=all). | Type: array","disabled":true},{"key":"include_meta_fields","value":"","description":"Include matched meta-field snippets in each hit. | Type: boolean","disabled":true},{"key":"include_ocr_preview","value":"","description":"Include short OCR text previews (larger payload). | Type: boolean","disabled":true},{"key":"similarity_threshold","value":"","description":"Minimum semantic similarity score (0.0–1.0, default 0.5). | Type: number","disabled":true},{"key":"multi_vector","value":"","description":"Advanced: restrict embedding types used in semantic leg (comma-separated). | Type: string","disabled":true},{"key":"vector_weight","value":"","description":"Hybrid mode: semantic leg weight (0.0–1.0). | Type: number","disabled":true},{"key":"bm25_weight","value":"","description":"Hybrid mode: keyword/BM25 leg weight (0.0–1.0). | Type: number","disabled":true}]},"description":"Full-text and hybrid document search **within the workspace you provide**.\n\n`workspace_id` is **required** — this endpoint does not search all workspaces in your account. Use `workspace_ids` to search multiple explicit workspaces in one call.\n\nSupports filters, semantic mode, and pagination.\n\n---\n**API reference:** `po-documents-search` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"Tag Autocomplete","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/tag-autocomplete?q=contract&workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["documents","tag-autocomplete"],"query":[{"key":"q","value":"contract","description":"**REQUIRED** | Search term (mind. 1 characters) | Type: string"},{"key":"workspace_id","value":"{{workspace_id}}","description":"Optional: Auf Workspace einschraenken | Type: integer","disabled":true},{"key":"limit","value":"","description":"Max. results (default: 20, max: 50) | Type: integer","disabled":true}]},"description":"## Overview\nAutocomplete tag names used in the account or workspace. Useful for consistent tagging in upload and edit flows.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-tags-autocomplete` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Transition document lifecycle","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/document-lifecycle-transition","host":["{{base_url}}"],"path":["documents","document-lifecycle-transition"]},"description":"## Overview\nChange the lifecycle status of a document. Only allowed transitions are possible.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-lifecycle-transition` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"pofid\": \"{{pofid}}\",\n    \"new_state\": \"in_review\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Update Document Comment","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-comment-update","host":["{{base_url}}"],"path":["documents","document-comment-update"]},"description":"## Overview\nUpdate the text of an existing document comment. Only the comment author or users with document edit permission may change content.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-comments-update` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"comment_id","type":"text","description":"**REQUIRED** | Document comment ID to update. | Type: integer","value":"{{comment_id}}"},{"key":"content","type":"text","description":"**REQUIRED** | New comment text. | Type: string","value":"Sample content"}]}},"response":[]},{"name":"Update Document Note","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-note-update","host":["{{base_url}}"],"path":["documents","document-note-update"]},"description":"## Overview\nUpdate title, category, or content of an existing document note.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-notes-update` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"note_id","type":"text","description":"**REQUIRED** | Note ID (Required) | Type: integer","value":"{{note_id}}"},{"key":"title","type":"text","description":"New title. | Type: string","value":"","disabled":true},{"key":"content","type":"text","description":"New note content. | Type: string","value":"","disabled":true},{"key":"category","type":"text","description":"new category | Type: string | Allowed: general, review, legal, technical, financial, internal","value":"","disabled":true},{"key":"is_pinned","type":"text","description":"Anheften/Loesen | Type: integer | Allowed: 0, 1","value":"","disabled":true},{"key":"is_private","type":"text","description":"Privat/Oeffentlich | Type: integer | Allowed: 0, 1","value":"","disabled":true}]}},"response":[]},{"name":"Upload document","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/document-put","host":["{{base_url}}"],"path":["documents","document-put"]},"description":"## Overview\nUpload one or more documents via **multipart/form-data** or provide a **`source_url`** (HTTPS) to fetch a file server-side.\n\n**Workspace (required):** provide **`workspace_id`** or **`workspace_name`** (auto-creates workspace when the name is new).\n\nOn success returns **`results[]`** (one object per file with `pofid`, `documents_id`, `filename`, …) — not a top-level `pofid`.\n\nAccepted multipart field names: `file`, `files`, `upload`, `attachment`, `document`, `UploadFiles`.\n\n**Chaining:** On success read **results[0].pofid** (array of upload results; not top-level pofid) from the response for the next API call.\n\n#### Required alternatives\n\nProvide **at least one** of: `file` **or** `source_url`.\n\nProvide **at least one** of: `workspace_id` **or** `workspace_name`.\n\n---\n**API reference:** `po-documents-upload` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"formdata","formdata":[{"key":"file","type":"file","description":"**ONE OF REQUIRED** | Multipart file field (file, files, upload, attachment, document, UploadFiles). | Type: file (binary)","src":null},{"key":"source_url","type":"text","description":"**ONE OF REQUIRED** | Alternative: HTTPS URL to download (alias: file_url, document_url). | Type: string","value":"","disabled":true},{"key":"workspace_id","type":"text","description":"**ONE OF REQUIRED** | Target workspace ID. Required unless workspace_name is set. | Type: integer","value":"","disabled":true},{"key":"workspace_name","type":"text","description":"**ONE OF REQUIRED** | Target workspace name (creates workspace if missing). Required unless workspace_id is set. Example: My Workspace. | Type: string","value":"My Workspace"},{"key":"processing_mode","type":"text","description":"Upload processing mode. | Type: string","value":"","disabled":true},{"key":"ai_dms_tier","type":"text","description":"AI-DMS processing tier: basic, premium, or ultra. | Type: string | Allowed: basic, premium, ultra","value":"basic","disabled":true},{"key":"document_agent_enabled","type":"text","description":"When true, enable document agent automation on upload. | Type: boolean","value":"","disabled":true},{"key":"share_context","type":"text","description":"Optional external share token JSON for uploads into a shared workspace. | Type: object","value":"","disabled":true}]}},"response":[]},{"name":"Accept workspace share by ID","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/paperoffice_account/accept_share_by_id","host":["{{base_url}}"],"path":["paperoffice_account","accept_share_by_id"]},"description":"Accepts a share from the inbox via share_id.\n\n---\n**API reference:** `po-workspaces-share-accept-by-id` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"share_id\": 1\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Accept workspace share invitation","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"url":{"raw":"{{base_url}}/paperoffice_account/accept_share","host":["{{base_url}}"],"path":["paperoffice_account","accept_share"]},"description":"Accepts a share invitation via token.\n\n---\n**API reference:** `po-workspaces-share-accept` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Cancel pending workspace share","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/paperoffice_account/cancel_invite","host":["{{base_url}}"],"path":["paperoffice_account","cancel_invite"]},"description":"Withdraws a pending invitation (owner).\n\n---\n**API reference:** `po-workspaces-share-cancel-invite` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"share_id\": 1,\n    \"confirm\": true\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Check workspace security access","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workspaces/access-check","host":["{{base_url}}"],"path":["workspaces","access-check"]},"description":"Check Workspace-Sicherheit (password/SMS), ACL and ob a gültige Unlock-Session for the Bearer exists.\n\n---\n**API reference:** `po-workspaces-security-check-access` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"workspace_id","type":"text","description":"**REQUIRED** | Required: Workspace ID to check access for | Type: string","value":"{{workspace_id}}"}]}},"response":[]},{"name":"Create workspace","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/workspaces-create","host":["{{base_url}}"],"path":["documents","workspaces-create"]},"description":"Create a new workspace to organize documents by client, project, or topic. Optional fields include security tier (`standard`, `business`, `compliance`; legacy alias `confidential` → `business`) and AI-DMS settings. After creation, use `List workspaces` to confirm the new `id`. **Permissions:** Workspace management (`workspaces-create`) — account admin or equivalent role required. **Related:** `List workspaces`, `Update workspace` in the same Headless DMS folder.\n\n---\n**API reference:** `po-workspaces-create` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"name\": \"Main archive\",\n    \"type\": \"archiv\",\n    \"workspace_tier\": \"standard\",\n    \"is_revision_secure\": false,\n    \"retention_years\": 10,\n    \"ai_dms_mode\": \"disabled\",\n    \"storage_mode\": \"cloud\",\n    \"priority\": 900\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Create workspace share","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/paperoffice_account/share_workspace","host":["{{base_url}}"],"path":["paperoffice_account","share_workspace"]},"description":"## Overview\nCreate an external workspace share (email and/or telephony channel).\n\n**Requires** `workspace_tier: business` (or legacy `confidential`) on the target workspace. `standard` workspaces return `WORKSPACE_TIER_NOT_SHAREABLE`. Check `GET /documents/workspaces-list` (`workspace_tier` or `_capabilities`) before calling.\n\nOwner permissions are enforced by the Bearer token scope.\n\n**HTTP status:** Returns **201 Created** on success (also accept **200** in clients).\n**Performance:** The HTTP response is synchronous. When email or SMS delivery is enabled, expect **10–30 seconds** latency while invitations are sent before the JSON response returns.\n\n---\n**API reference:** `po-workspaces-share-create` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"workspace_id\": \"{{workspace_id}}\",\n    \"share_document_access\": true,\n    \"telephony_enabled\": false,\n    \"access_level\": \"read\",\n    \"expires_days\": 30\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Decline workspace share invitation","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/paperoffice_account/decline_share","host":["{{base_url}}"],"path":["paperoffice_account","decline_share"]},"description":"Declines a pending workspace share invitation.\n\n---\n**API reference:** `po-workspaces-share-decline` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"share_id\": 1\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Get workspace share info by token","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/paperoffice_account/share_info?token={{share_token}}","host":["{{base_url}}"],"path":["paperoffice_account","share_info"],"query":[{"key":"token","value":"{{share_token}}","description":"**REQUIRED** | Share token from invite link. | Type: string"},{"key":"share_token","value":"","description":"Alias for token. | Type: string","disabled":true}]},"description":"Public share metadata by token (no login). Provide `token` or `share_token` query parameter from the share invite link.\n\n---\n**API reference:** `po-workspaces-share-info` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"Get workspace telephony agent assignment","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/paperoffice_account/workspace_telephony_agent?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["paperoffice_account","workspace_telephony_agent"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"**REQUIRED** | Numeric workspace ID. | Type: integer"}]},"description":"Read conversation agent assignment for phone shares in the workspace.\n\n---\n**API reference:** `po-workspaces-telephony-agent-get` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"List external workspace users","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/paperoffice_account/external_users","host":["{{base_url}}"],"path":["paperoffice_account","external_users"]},"description":"Lists external users with workspace access (admin view, root/administrator).\n\n---\n**API reference:** `po-workspaces-external-users-list` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"List my workspace shares","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/paperoffice_account/my_shares?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["paperoffice_account","my_shares"],"query":[{"key":"workspace_id","value":"{{workspace_id}}","description":"Optional: filter by workspace | Type: integer","disabled":true},{"key":"include_history","value":"","description":"Include revoked/expired shares | Type: boolean","disabled":true}]},"description":"Lists shares created by the current user as owner.\n\n---\n**API reference:** `po-workspaces-shares-list` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"List workspaces","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/documents/workspaces-list","host":["{{base_url}}"],"path":["documents","workspaces-list"],"query":[{"key":"locale","value":"","description":"Response language: de_DE, en_US, es_ES, fr_FR, it_IT, pt_PT | Type: string","disabled":true}]},"description":"List all workspaces accessible to the authenticated account. Returns workspace `id`, `name`, `type`, document counts, and storage metadata when available. Use this before uploads, searches, or updates that require a `workspace_id`. **Permissions:** Workspace management (`workspaces-list`) — account admin or equivalent role required. **Related:** `Create workspace`, `Update workspace` in the same Headless DMS folder.\n\n---\n**API reference:** `po-workspaces-list` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"List workspaces shared with me","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/paperoffice_account/shared_with_me","host":["{{base_url}}"],"path":["paperoffice_account","shared_with_me"]},"description":"Lists workspaces shared with the current user (recipient perspective).\n\n---\n**API reference:** `po-workspaces-shares-shared-with-me` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"Resend workspace share invitation","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/paperoffice_account/resend_invite","host":["{{base_url}}"],"path":["paperoffice_account","resend_invite"]},"description":"Resends a pending share invitation (owner only, rate-limited).\n\n---\n**API reference:** `po-workspaces-share-resend-invite` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"share_id\": 1\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Revoke or leave workspace share","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/paperoffice_account/revoke_share","host":["{{base_url}}"],"path":["paperoffice_account","revoke_share"]},"description":"Revokes a share (owner) or leaves it (recipient).\n\n---\n**API reference:** `po-workspaces-share-revoke` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"share_id\": 1,\n    \"confirm\": true\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Set workspace telephony agent assignment","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/paperoffice_account/workspace_set_telephony_agent","host":["{{base_url}}"],"path":["paperoffice_account","workspace_set_telephony_agent"]},"description":"Set or remove the primary conversation agent for phone shares (funnel_id=0 clears assignment).\n\n---\n**API reference:** `po-workspaces-telephony-agent-set` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"formdata","formdata":[{"key":"workspace_id","type":"text","description":"**REQUIRED** | Numeric workspace ID. | Type: integer","value":"{{workspace_id}}"},{"key":"funnel_id","type":"text","description":"**REQUIRED** | Conversation Agent funnel ID (0 = clear assignment) | Type: integer","value":"1"}]}},"response":[]},{"name":"Update workspace","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/documents/workspaces-update","host":["{{base_url}}"],"path":["documents","workspaces-update"]},"description":"## Overview\nUpdate an existing workspace — rename, change description, adjust security tier, or metadata.\n\nCall `GET /documents/workspaces-list` first to obtain the numeric workspace ID.\n\n**ID parameter:** send `id` (canonical) or `workspace_id` (alias accepted by the API).\n\nPartial updates are supported where noted in the parameter schema.\n\n---\n**API reference:** `po-workspaces-update` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"id\": \"{{workspace_id}}\",\n    \"workspace_tier\": \"standard\",\n    \"ai_dms_mode\": \"disabled\",\n    \"priority\": 100,\n    \"workspace_id\": \"{{workspace_id}}\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Update workspace share","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/paperoffice_account/update_share","host":["{{base_url}}"],"path":["paperoffice_account","update_share"]},"description":"Updates permissions and settings of an existing workspace share (owner only).\n\n---\n**API reference:** `po-workspaces-share-update` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"share_id\": 1,\n    \"access_level\": \"read\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Validate Workspace Storage Health","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/documents/workspace-storage-health","host":["{{base_url}}"],"path":["documents","workspace-storage-health"]},"description":"## Overview\nCheck storage connectivity and health for a workspace — cloud mode, **BYOS** (Bring Your Own Storage) mount status, latency, offline detection, and auto-lock reasons.\n\nEspecially relevant for workspaces that use **Storage Mounts** with external SSH/SFTP storage.\n\nRequires workspace **view** permission.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-workspaces-validate-storage` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"workspace_id","type":"text","description":"**REQUIRED** | Workspace ID to check | Type: integer","value":"{{workspace_id}}"}]}},"response":[]}]},{"name":"💾 Storage Mounts","description":"# Storage Mounts\n\n**Storage Mounts** connect external storage (S3-compatible, Azure Blob, GCS, SFTP, WebDAV) as virtual drives. List, read, write, and sync files into PaperOffice workspaces.\n\n---\n\n## Typical setup\n\n1. Configure mount credentials (secure storage on PaperOffice side)\n2. Test connectivity\n3. Run sync or selective import jobs\n4. Surface files in **Headless DMS**\n\n---\n\n## Security\n\n- Use least-privilege credentials per mount\n- Rotate keys via account settings; never embed secrets in client apps\n\nOperations may be synchronous REST or jobs depending on payload size — see per-endpoint Docs.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.","item":[{"name":"Add Storage Mount","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/storage_mounts/add","host":["{{base_url}}"],"path":["storage_mounts","add"]},"description":"Add an external storage mount (SFTP example). Required: `name`, `host`, `username`, and credentials (`password` or `ssh_key`). BYOS mounts also require `encryption_key`.\n\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-add` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"name\": \"Example SFTP mount {{$timestamp}}\",\n    \"host\": \"sftp.example.com\",\n    \"connector_type\": \"sftp\",\n    \"mount_purpose\": \"byos\",\n    \"username\": \"mount_user\",\n    \"base_path\": \"\\/\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Browse storage mount files","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/storage_mounts/browse?mount_id=1","host":["{{base_url}}"],"path":["storage_mounts","browse"],"query":[{"key":"mount_id","value":"1","description":"**REQUIRED** | ID of the storage mount to browse | Type: integer"},{"key":"path","value":"","description":"Path to browse. Relative paths are resolved against mount base_path. Use / for root. | Type: string","disabled":true}]},"description":"Browse files and directories on a storage mount. Returns file listing with metadata (size, modified date, type).\n\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-browse` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"Create storage mount directory","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/storage_mounts/mkdir","host":["{{base_url}}"],"path":["storage_mounts","mkdir"]},"description":"## Overview\nCreate a folder on a configured storage mount (SFTP/FTP).\n\n**Endpoint:** `POST /storage_mounts/mkdir`\n\n## Required JSON body\n\n| Field | Required | Description |\n|-------|----------|-------------|\n| `mount_id` | Yes | Mount ID from `GET /storage_mounts/list` |\n| `folder_name` | Yes | New folder name (not the full path) |\n| `path` | No | Parent directory on the mount (defaults to mount base path) |\n\nConnection failures to the remote host return HTTP **422** with `MOUNT_UNREACHABLE`, not HTTP 500.\n\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-mkdir` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"mount_id\": 1,\n    \"folder_name\": \"Example name\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Create storage mount mirror","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/storage_mounts/mirrors-add","host":["{{base_url}}"],"path":["storage_mounts","mirrors-add"]},"description":"## Overview\nAdd a new mirror target for a storage mount. Configure destination, sync interval, and filter rules.\n\n## Request parameters\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-mirrors-create` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"source_mount_id\": \"{{mount_id}}\",\n    \"target_mount_id\": \"{{mount_id_2}}\",\n    \"sync_mode\": \"realtime\",\n    \"priority\": 900\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Delete Storage Mount","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"url":{"raw":"{{base_url}}/storage_mounts/delete","host":["{{base_url}}"],"path":["storage_mounts","delete"]},"description":"## Overview\nDelete a storage mount configuration. Fails when active connectors still reference the mount.\n\n## Request parameters\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-delete` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Delete storage mount mirror","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/storage_mounts/mirrors-remove","host":["{{base_url}}"],"path":["storage_mounts","mirrors-remove"]},"description":"## Overview\nRemove a mirror configuration from a storage mount. Stops future syncs but does not delete mirrored data.\n\n## Request parameters\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-mirrors-delete` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"mirror_id\": 1\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Get storage mount details","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/storage_mounts/get","host":["{{base_url}}"],"path":["storage_mounts","get"],"query":[{"key":"mount_id","value":"","description":"Parameter: mount_id | Type: integer","disabled":true}]},"description":"## Overview\nGet full details for one storage mount — connector type, host, base path, health status, and linked connectors.\n\n## Request parameters\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-get` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Get storage mount health status","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/storage_mounts/health","host":["{{base_url}}"],"path":["storage_mounts","health"]},"description":"## Overview\nCheck health status of all configured storage mounts. Returns availability, latency, and disk usage per mount.\n\n## Request parameters\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-health` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"List storage mount mirrors","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/storage_mounts/mirrors-list?mount_id=1","host":["{{base_url}}"],"path":["storage_mounts","mirrors-list"],"query":[{"key":"mount_id","value":"1","description":"**REQUIRED** | Source mount ID to list mirrors for | Type: integer"}]},"description":"## Overview\nList all configured mirror targets for storage mounts. Shows mirror destinations, sync status, and last sync time.\n\n## Request parameters\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-mirrors-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"List storage mounts","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/storage_mounts/list","host":["{{base_url}}"],"path":["storage_mounts","list"]},"description":"List configured storage mounts for the account with connection status and mount purpose.\n\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-list` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"Test storage mount connection","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"url":{"raw":"{{base_url}}/storage_mounts/test","host":["{{base_url}}"],"path":["storage_mounts","test"]},"description":"Test whether a saved storage mount is reachable, or validate connector credentials before saving.\n\n**Dry-run credentials:** Pass `connector_type`, `host`, `port`, `username`, and `password` in the JSON body to test a connection without persisting a mount. Use placeholder credentials in shared collections — never store production secrets in Postman.\n\n**Saved mount:** Provide `mount_id` only to test an existing configured mount.\n\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-test` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Toggle storage mount mirror","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/storage_mounts/mirrors-toggle","host":["{{base_url}}"],"path":["storage_mounts","mirrors-toggle"]},"description":"## Overview\nEnable or disable a storage mount mirror without deleting the configuration. Useful for temporary maintenance.\n\n## Request parameters\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-mirrors-toggle` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"mirror_id\": 1,\n    \"is_active\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Update Storage Mount","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"url":{"raw":"{{base_url}}/storage_mounts/update","host":["{{base_url}}"],"path":["storage_mounts","update"]},"description":"## Overview\nUpdate Storage Mount Modify an existing storage mount. Required: mount_id Optional: Any field to update\n\n## Request parameters\n## Best practices\n- Use Storage Mount and workspace identifiers from list/get endpoints — not document `pofid` unless a parameter explicitly requires it.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-storage-mounts-update` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[]}]},{"name":"✍️ E-Signatures","description":"# E-Signatures\n\n**E-Signatures** manages digital signature workflows: create requests, add signers, track status, download signed PDFs, and verify completion.\n\n---\n\n## Flow\n\n1. Create signature request (document reference or upload)\n2. Assign signers and routing order\n3. Poll status or receive webhooks (**Account & Administration → Webhooks**)\n4. Download executed document\n\n---\n\n## Notes\n\n- Multi-signer and reminder behavior are per-request parameters\n- Combine with **PDF AI** for final layout before sending\n- Legal requirements vary by jurisdiction — validate with your counsel\n---\n\n## Shared execution model (jobs)\n\n| Concept | Detail |\n|---------|--------|\n| **Bearer token** | Required for all processing endpoints |\n| **Connection hold** | Default `client_wait=true` — hold HTTP up to about 295 s, then **200** or **202** + `poll_url` |\n| **Polling** | `GET /job/get/{job_id}` after **202** or when work exceeds the hold |\n| **Queue priority** | Optional `priority` — omit for plan default; see **Introduction & Basics → Guides** |\n\nCredit amounts are **not** duplicated here — use **`GET /job/pricelist`** or `_billing` on responses.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Cancel signature request (eSignatures API)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"url":{"raw":"{{base_url}}/signatures/cancel","host":["{{base_url}}"],"path":["signatures","cancel"]},"description":"## Overview\nCancel a pending e-signature request. Signers can no longer complete after cancellation; completed requests cannot be cancelled.\n\n## Request parameters\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-esignatures-cancel-signature-request` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Configure signing reminders","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/signature_link/get_reminder_settings?action=get","host":["{{base_url}}"],"path":["signature_link","get_reminder_settings"],"query":[{"key":"action","value":"get","description":"**REQUIRED** | get = read settings, save = save settings | Type: string | Allowed: get, save"},{"key":"reminder_enabled","value":"","description":"Enable/disable reminders (only for save) | Type: boolean","disabled":true},{"key":"first_after_days","value":"","description":"Days until first reminder | Type: number","disabled":true},{"key":"interval_days","value":"","description":"Days between reminders | Type: number","disabled":true},{"key":"max_count","value":"","description":"Maximum number of reminders | Type: number","disabled":true},{"key":"channels","value":"","description":"Channels: email, sms | Type: array","disabled":true}]},"description":"## Overview\nReturns global reminder settings for signing requests (**GET only**).\n\nTo update settings, use `POST /signature_link/save_reminder_settings` (`po_signature_link_save_reminder_settings`).\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signing-reminders-configure` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Create signature request (eSignatures API)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/signatures/create","host":["{{base_url}}"],"path":["signatures","create"]},"description":"Create an e-signature request. Requires `document_pofid` (or `pofid`) and a `signers` array; each signer needs `name`, `email`, and `phone` (E.164, required for SMS verification).\n\n#### Required alternatives\n\nProvide **at least one** of: `document_pofid` **or** `pofid`.\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-esignatures-create-signature-request` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"document_pofid\": \"{{pofid}}\",\n    \"signers\": [\n        {\n            \"name\": \"Jane Doe\",\n            \"email\": \"signer@example.com\",\n            \"phone\": \"+49301234567\"\n        }\n    ],\n    \"channel\": \"email\",\n    \"signature_type\": \"ses\",\n    \"signing_order\": \"parallel\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Create signature request (signing link)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/signature_link/create_and_send","host":["{{base_url}}"],"path":["signature_link","create_and_send"]},"description":"## Overview\nCreate a signing request and send invitations.\n\nEach signer requires `name`, `email`, and **`phone` (E.164)** — SMS verification is enforced by default even when `channel` is `none`.\n\n**Latency:** `channel: \"email\"` may block this HTTP request while SMTP delivery runs (often 20+ seconds). For API automation and tests, use `channel: \"none\"` and deliver links separately; production email sending may move to async delivery in a future release.\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signing-request-create` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"document_pofid\": \"{{pofid}}\",\n    \"signers\": [\n        {\n            \"name\": \"Jane Doe\",\n            \"email\": \"signer@example.com\",\n            \"phone\": \"+49301234567\"\n        }\n    ],\n    \"channel\": \"email\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Download eSignature Document","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/signatures/download","host":["{{base_url}}"],"path":["signatures","download"],"query":[{"key":"signature_id","value":"","description":"Signature request ID | Type: string","disabled":true}]},"description":"Download the signed PDF for a completed e-signature request. Provide the signature request UUID from create/status endpoints; returns the final signed document file.\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-esignatures-download-signed-document` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"Generate mobile signing link","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/signature_link/generate_mobile_token","host":["{{base_url}}"],"path":["signature_link","generate_mobile_token"]},"description":"## Overview\nGenerate a mobile-friendly signing URL (QR code flow). **JSON body required** — send `application/json`, not multipart.\n\n**Required:** `document_pofid` (POFID of the document to sign).\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signing-mobile-link-generate` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"document_pofid\": \"{{pofid}}\",\n    \"expires_hours\": 24\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Get signature details","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/signatures/get","host":["{{base_url}}"],"path":["signatures","get"],"query":[{"key":"signature_id","value":"","description":"Signature request ID | Type: string","disabled":true}]},"description":"Get status and signer details for an e-signature request — pending, completed, or declined.\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-esignatures-get-signature-details` (documentation ID; not a `/job/add/` pipeline slug)"},"response":[]},{"name":"List signature requests (eSignatures API)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/signatures/list","host":["{{base_url}}"],"path":["signatures","list"],"query":[{"key":"status","value":"","description":"Filter by signature status (pending, completed, declined, expired). | Type: string | Allowed: draft, pending, sent, completed, declined, expired, cancelled","disabled":true},{"key":"page","value":"","description":"Page number for pagination (1-based). | Type: integer | Min: 1","disabled":true},{"key":"limit","value":"","description":"Number of results per page. | Type: integer | Min: 1 | Max: 100","disabled":true}]},"description":"## Overview\nList e-signature requests with status filters — pending, completed, declined, or expired.\n\n## Request parameters\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-esignatures-list-signature-requests` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"List signature requests (signing link / batch)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/signature_link/get_batch_status","host":["{{base_url}}"],"path":["signature_link","get_batch_status"]},"description":"## Overview\nBatch signing status for multiple documents.\n\n**JSON body:** `pofids` — array of POFID strings (alias `document_pofids` also accepted).\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signing-requests-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"pofids\": [\n        \"{{pofid}}\"\n    ]\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"List signature types","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/signatures/types","host":["{{base_url}}"],"path":["signatures","types"],"query":[{"key":"include_types","value":"","description":"Load eIDAS types (default: true) | Type: boolean","disabled":true},{"key":"include_templates","value":"","description":"Load saved templates (default: true) | Type: boolean","disabled":true}]},"description":"## Overview\nList available signature types and saved signature templates. Returns eIDAS signature levels (SES simple, AES advanced, QES qualified) and stored signature/initial templates for the account. Use before creating signing requests to know available options.\n\n## Request parameters\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signing-types-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Save signature template","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/signatures/save_template","host":["{{base_url}}"],"path":["signatures","save_template"]},"description":"## Overview\nSave signer field placements and template metadata for reuse in future e-signature requests.\n\n## Request parameters\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signing-template-save` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"signature_image\": \"signature_image_value\",\n    \"type\": \"signature\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Send reminder","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"url":{"raw":"{{base_url}}/signatures/remind","host":["{{base_url}}"],"path":["signatures","remind"]},"description":"## Overview\nSend a reminder email to pending signers on an e-signature request.\n\n## Request parameters\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-esignatures-send-reminder` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Verify signature","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/signature_link/verify_document","host":["{{base_url}}"],"path":["signature_link","verify_document"]},"description":"## Overview\nVerify, check and validate digital signatures on a document. Validates signature integrity, certificate chain, eIDAS compliance (SES/AES/QES). Accepts POFID, upload_id, or file_url.\n\n## Request parameters\n#### Required alternatives\n\nProvide **at least one** of: `document_pofid` **or** `file_url` **or** `upload_id`.\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signing-verify` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"document_pofid","type":"text","description":"**ONE OF REQUIRED** | POFID of the document to verify | Type: string","value":"{{pofid}}"},{"key":"upload_id","type":"text","description":"**ONE OF REQUIRED** | Upload ID from the upload page | Type: string","value":"","disabled":true},{"key":"file_url","type":"text","description":"**ONE OF REQUIRED** | Public URL of a PDF file | Type: string","value":"","disabled":true},{"key":"file_name","type":"text","description":"Filename for uploaded file | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Cancel signing request (signing link)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/signature_link/cancel_signing_request","host":["{{base_url}}"],"path":["signature_link","cancel_signing_request"]},"description":"## Overview\n## Overview\nCancel a pending signing-link request by signing ID. Signers can no longer complete after cancellation.\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signature-links-cancel-signing-request` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"request_id\": \"42\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Check signing status","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/signature_link/get_signing_status?signing_id={{signing_id}}","host":["{{base_url}}"],"path":["signature_link","get_signing_status"],"query":[{"key":"signing_id","value":"{{signing_id}}","description":"**REQUIRED** | Signing request ID (legacy alias: signing_id). | Type: string","disabled":false}]},"description":"## Overview\nCheck the signing status of a signature-link request — pending, completed, or expired.\n\n## Request parameters\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signature-links-check-signing-status` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Download Signing Link Document","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/signature_link/download_signed_document?signing_id={{signing_id}}","host":["{{base_url}}"],"path":["signature_link","download_signed_document"],"query":[{"key":"signing_id","value":"{{signing_id}}","description":"Authenticated download: signing request ID. | Type: string","disabled":false},{"key":"token","value":"","description":"Public signer download: access token from signing URL (?token=). | Type: string","disabled":true},{"key":"type","value":"","description":"Download package: full (signed PDF) or certificate (audit trail only). | Type: string | Allowed: full, certificate","disabled":true}]},"description":"## Overview\nDownload a signed PDF or certificate.\n\n- **Authenticated:** pass `request_id` (alias `signing_id`).\n- **Public signer link:** pass `token` query parameter (no Bearer).\n\nOptional `type`: `full` (default) or `certificate`.\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signature-links-download-signed-document` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Get document signatures","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/signature_link/get_document_signatures?document_pofid={{pofid}}","host":["{{base_url}}"],"path":["signature_link","get_document_signatures"],"query":[{"key":"document_pofid","value":"{{pofid}}","description":"**REQUIRED** | Document PO-FID (aliases: pofid, document_id). | Type: string"}]},"description":"## Overview\nList signature records and signer status for a document accessed via signature links.\n\n## Request parameters\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signature-links-get-document-signatures` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Resend invitation","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/signature_link/resend_invitation","host":["{{base_url}}"],"path":["signature_link","resend_invitation"]},"description":"## Overview\nResend a signing invitation email for a pending signature-link participant.\n\n## Request parameters\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signature-links-resend-invitation` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"signer_id\": 1,\n    \"channel\": \"email\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Save signing reminder settings","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"url":{"raw":"{{base_url}}/signature_link/save_reminder_settings","host":["{{base_url}}"],"path":["signature_link","save_reminder_settings"]},"description":"## Overview\nPersist **account-wide** signing reminder defaults (not per signing request).\n\n**HTTP:** `POST /signature_link/save_reminder_settings` with JSON or form body.\n\nTo read current values use `GET /signature_link/get_reminder_settings`.\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signature-link-save-reminder-settings` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Send Signing Request","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/signature_link/send_signing_request","host":["{{base_url}}"],"path":["signature_link","send_signing_request"]},"description":"## Overview\nSend a signature-link signing request to one or more external signers.\n\n## Request parameters\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signature-links-send-signing-request` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"request_id\": \"42\",\n    \"channel\": \"email\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Sign document","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/signature_link/sign","host":["{{base_url}}"],"path":["signature_link","sign"]},"description":"## Overview\nSigner-facing **public** endpoint — **no Bearer token**. Submit a signature image or text for an active signing request.\n\n## Request parameters\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `token` | string | Yes | Signing token from the invitation email/SMS (`?token=` query parameter) |\n| `signature_data` | string | No | Base64 PNG signature image (drawn signature) |\n| `signer_name` | string | No | Display name for text-field signatures |\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signature-links-sign-document` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"signature\": \"signature_value\",\n    \"signature_type\": \"draw\"\n}","options":{"raw":{"language":"json"}}},"auth":{"type":"noauth"}},"response":[]},{"name":"Verify otp","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/signature_link/verify_otp","host":["{{base_url}}"],"path":["signature_link","verify_otp"]},"description":"## Overview\nSigner-facing **public** endpoint — **no Bearer token**. Verifies the one-time password (OTP) for a signing-link session.\n\n## Request parameters\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `token` | string | Yes | Signing token from the invitation (`?token=` query parameter) |\n| `otp` | string | Yes | OTP code from SMS or email |\n\n## Best practices\n- Use `request_id` for signing requests (legacy alias: `signing_id`). Public signer URLs use `token`. Document scope uses `document_pofid`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-signature-links-verify-otp` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"otp\": \"otp_value\"\n}","options":{"raw":{"language":"json"}}},"auth":{"type":"noauth"}},"response":[]}]},{"name":"📦 Import & Migration","description":"# Import & Migration\n\n**Import & Migration** supports bulk imports from files or external systems: configure mappings, start import jobs, monitor progress, and reconcile errors.\n\n---\n\n## Pattern\n\n1. Define source (upload batch or connector)\n2. Map fields to DMS schema\n3. Start import **job**\n4. Poll until complete; inspect per-row errors in result payload\n\nUse for initial tenant onboarding or periodic sync from legacy DMS exports.\n---\n\n## Shared execution model (jobs)\n\n| Concept | Detail |\n|---------|--------|\n| **Bearer token** | Required for all processing endpoints |\n| **Connection hold** | Default `client_wait=true` — hold HTTP up to about 295 s, then **200** or **202** + `poll_url` |\n| **Polling** | `GET /job/get/{job_id}` after **202** or when work exceeds the hold |\n| **Queue priority** | Optional `priority` — omit for plan default; see **Introduction & Basics → Guides** |\n\nCredit amounts are **not** duplicated here — use **`GET /job/pricelist`** or `_billing` on responses.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Cancel import job","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/import/import-cancel","host":["{{base_url}}"],"path":["import","import-cancel"]},"description":"## Overview\nCancel a running import job. Already imported files remain; queued work is stopped.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-import-cancel` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"job_id\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Create import job","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/import/import-create","host":["{{base_url}}"],"path":["import","import-create"]},"description":"## Overview\nCreate an import job.\n\n**Recommended ZIP flow:**\n1. `POST /import/upload-source` (multipart `file` = ZIP) → copy `data.temp_file_id`\n2. `POST /import/import-create` with `source_type: local_upload` (or `elo_office`) and `source_config: { \"temp_file_id\": \"<handle>\" }`\n\nFor SFTP/S3/WebDAV, use the matching `source_type` with a JSON `source_config` object (`host`, credentials, `path`).\n\n---\n**API reference:** `po-import-create` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"workspace_id\": \"{{workspace_id}}\",\n    \"source_type\": \"local_upload\",\n    \"source_config\": {\n        \"temp_file_id\": \"{{import_temp_file_id}}\"\n    },\n    \"max_file_size_mb\": \"50\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Delete import job","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/import/import-delete","host":["{{base_url}}"],"path":["import","import-delete"]},"description":"## Overview\nDelete an import job record and its temporary staging artifacts. Does not delete documents already committed to the DMS.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-import-delete` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"job_id\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Get import status","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/import/import-status","host":["{{base_url}}"],"path":["import","import-status"]},"description":"## Overview\nReturns the current import job status including live file counters.\n\n**Response `data` fields:** `total_files` and `processed_files` (aliases), plus `total_files_found`, `total_files_imported`, `total_files_failed`, `total_files_skipped`, `progress_percent`, `result_state`.\n\nSet `include_report: true` for skip/failure breakdown on completed jobs.\n\n---\n**API reference:** `po-import-status` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"job_id\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"List import files","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/import/import-files","host":["{{base_url}}"],"path":["import","import-files"]},"description":"## Overview\nReturn the paginated file list for an import job (per-file status: pending, imported, failed, skipped).\n\nSend `job_id` in a JSON body (`application/json`) or as a query parameter.\n\n---\n**API reference:** `po-import-files` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"job_id\": \"{{import_job_id}}\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"List import Jobs","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/import/import-jobs-list","host":["{{base_url}}"],"path":["import","import-jobs-list"]},"description":"## Overview\nList all import jobs of the account including KPI statistics (Total, Completed, In Progress, Failed).\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-import-jobs-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"limit","type":"text","description":"Maximum number Jobs (Default: 50, Max: 200) | Type: integer","value":"","disabled":true},{"key":"offset","type":"text","description":"Offset for pagination (Default: 0) | Type: integer","value":"","disabled":true},{"key":"status","type":"text","description":"Filter by job status (pending, scanning, scan_complete, importing, completed, failed, cancelled) | Type: string | Allowed: pending, scanning, scan_complete, importing, completed, failed, cancelled","value":"","disabled":true}]}},"response":[]},{"name":"Request import upload URL","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/import/request-upload-url","host":["{{base_url}}"],"path":["import","request-upload-url"]},"description":"## Overview\nGenerate a signed upload URL for **direct file upload** (direct upload).\n\nReturns `upload_url`, HMAC `upload_token`, and `expires_in`. An empty POST body is valid when `purpose` defaults to `import/upload-source` (form field or query).\n\nThe `upload_url` targets the **direct upload node** for your account cluster (bypasses the CDN). This is intentional for large files.\n\n## Request parameters\n| Parameter | Required | Notes |\n|-----------|----------|-------|\n| `purpose` | no | `import/upload-source` (default) or `import/upload-local-files` |\n\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-import-request-upload-url` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"purpose","type":"text","description":"**REQUIRED** | Upload-Zweck | Type: string | Allowed: import/upload-source, import/upload-local-files","value":"import/upload-source"}]}},"response":[]},{"name":"Retry import job","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/import/import-retry","host":["{{base_url}}"],"path":["import","import-retry"]},"description":"## Overview\nRetry a failed import job from the last checkpoint. Use after fixing source files or connector configuration.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-import-retry` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"job_id\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Scan import source","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/import/import-scan","host":["{{base_url}}"],"path":["import","import-scan"]},"description":"## Overview\nScans the import source and lists all found files. Returns count, sizes, and type breakdown.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-import-scan` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"job_id\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Start import job","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/import/import-start","host":["{{base_url}}"],"path":["import","import-start"]},"description":"Start the import process (in batches, 50 files per call). Repeat calls until all files are imported.\n\n---\n**API reference:** `po-import-start` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"raw","raw":"{\n    \"job_id\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Upload local files to import","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/import/upload-local-files","host":["{{base_url}}"],"path":["import","upload-local-files"]},"description":"## Overview\nUpload multiple files with folder structure (local batch import).\n\nFiles are grouped in a temporary account-scoped import session for the duration of the import job. Use `session_id` to correlate batches from the same import run.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-import-upload-local-files` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"files\": [\n        \"example\"\n    ]\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Upload ZIP source for import","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/import/upload-source","host":["{{base_url}}"],"path":["import","upload-source"]},"description":"## Overview\nUpload a ZIP archive for bulk import (ELO export or local_upload ZIP mode).\n\n**Response:** `data.temp_file_id` (opaque handle) — **not** an internal server path.\n\n**Next step:** `POST /import/import-create` with `source_type: local_upload` or `elo_office` and `source_config: { \"temp_file_id\": \"<from upload-source>\" }`.\n\nLegacy `source_config.zip_path` with an absolute server path is still accepted for backward compatibility but is not returned by this endpoint.\n\n---\n**API reference:** `po-import-upload-source` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"formdata","formdata":[{"key":"file","type":"file","description":"**REQUIRED** | ZIP-file | Type: file (binary)","src":null},{"key":"source_type","type":"text","description":"Import source type (e.g. zip_upload, cloud_connector). | Type: string | Allowed: elo_office, local_upload","value":"","disabled":true}]}},"response":[]}]},{"name":"📊 AI Document Operations","description":"# AI Document Operations\n\nExtract **entities**, **relations**, and **knowledge graphs** from processed documents — the analytics layer behind Document AI pipelines.\n\n---\n\n## Typical workflow\n\n1. Run **AI-IDP** or **AI-OCR** on a document (job pipeline).\n2. Call **`GET /document_intelligence/entities/{pofid}`** for structured entities.\n3. Use **`GET /document_intelligence/relations/{pofid}`** or knowledge-graph endpoints for cross-document insights.\n\nLarge workspace graphs may return paginated nodes — poll job endpoints when responses use HTTP 202.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.","item":[{"name":"Get document metadata","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/meta_fields/{{pofid}}","host":["{{base_url}}"],"path":["document_intelligence","meta_fields","{{pofid}}"],"query":[{"key":"category","value":"","description":"Optional filter: financial, parties, metadata, dates, content, etc. | Type: string","disabled":true}],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nGet document analysis metadata including extraction confidence, model hints, and field coverage for a processed document.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-document-analysis-metadata` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get document embeddings (read)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/embeddings/{{documents_id}}","host":["{{base_url}}"],"path":["document_intelligence","embeddings","{{documents_id}}"],"query":[{"key":"type","value":"","description":"Embedding type: document_summary, document_full, page, paragraph, metadata, entity | Type: string","disabled":true},{"key":"include_vectors","value":"","description":"Include raw embedding vectors (large payload; default: false). | Type: boolean","disabled":true}],"variable":[{"key":"documents_id","value":"","description":"Numeric document ID (alternative to pofid on some endpoints)."}]},"description":"## Overview\nRead all embedding types of a document — summary, full, page, paragraph, metadata, entity, and vision layers where available.\n\n**Endpoint:** `GET /document_intelligence/embeddings/{documents_id}`\n\nUse `include_vectors=false` (default) for metadata-only responses. Enable vectors only when raw embedding data is required (large payload).\n\n## Generate embeddings\n\nEmbeddings are created by **Document AI processing** (detection / AI-DMS workflow tier basic or higher), not by a separate public queue endpoint. After processing, use this GET endpoint to read stored vectors.\n\n## Related\n\n- Semantic search: `POST /document_intelligence/embeddings/search`\n\n---\n**API reference:** `po-embeddings-document-get` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Search embeddings","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/document_intelligence/embeddings/search","host":["{{base_url}}"],"path":["document_intelligence","embeddings","search"]},"description":"## Overview\nDirect semantic vector search over Document Intelligence embeddings. Choose embedding type (document_summary, page, paragraph, metadata), min-score and workspace filter.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-embeddings-search` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).","body":{"mode":"formdata","formdata":[{"key":"query","type":"text","description":"**REQUIRED** | Search query (natural language) | Type: string","value":"contract"},{"key":"embedding_type","type":"text","description":"Embedding layer | Type: string | Allowed: document_summary, document_full, page, paragraph, metadata","value":"","disabled":true},{"key":"workspace_id","type":"text","description":"Limit to workspace | Type: number","value":"{{workspace_id}}","disabled":true},{"key":"limit","type":"text","description":"Max results (1-50) | Type: number","value":"","disabled":true},{"key":"min_score","type":"text","description":"Min similarity (0.0-1.0, default 0.3) | Type: number | Max: 1","value":"","disabled":true}]}},"response":[]},{"name":"Get canonical entities (entity index)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/entities/canonical?workspace_id={{workspace_id}}","host":["{{base_url}}"],"path":["document_intelligence","entities","canonical"],"query":[{"key":"type","value":"","description":"Optional: Filter by entity type | Type: string","disabled":true},{"key":"workspace_id","value":"{{workspace_id}}","description":"Optional: Filter by workspace | Type: string","disabled":true},{"key":"search","value":"","description":"Optional: Search term | Type: string","disabled":true},{"key":"limit","value":"","description":"Max results (default: 100, max: 500) | Type: string","disabled":true}]},"description":"## Overview\nCanonical deduplicated entities across all documents. Shows how often an entity appears in different documents.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-entities-get-canonical-entities` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get document summary","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/summary/{{pofid}}","host":["{{base_url}}"],"path":["document_intelligence","summary","{{pofid}}"],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nCompact summary of all Document Intelligence data. An endpoint for all key metrics and API links.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-summary-stats-get-document-summary` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]},{"name":"Get vision data","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/document_intelligence/vision/{{pofid}}","host":["{{base_url}}"],"path":["document_intelligence","vision","{{pofid}}"],"query":[{"key":"include","value":"","description":"all, tables, charts, forms, barcodes, layout | Type: string","disabled":true}],"variable":[{"key":"pofid","value":"{{pofid}}","description":"Document ID in POFID format (from document-search, document-put, or documents-list)."}]},"description":"## Overview\nVision-extracted data Ultra-Tier. Includes: - Tables - Structured table data with rows/columns - charts - Recognized charts with data - Form Fields - Form fields with values - barcodes - QR codes and barcodes - Layout - Document structure Headers, Paragraphs, etc.\n\n## Request parameters\n## Best practices\n- Use `pofid` for document references (PaperOffice File ID from list/get endpoints).\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-vision-get-vision-data` (documentation ID; not a `/job/add/` pipeline slug) • **Pricing:** From 1 credit — variable by plan and feature — see `GET /job/pricelist` or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator)."},"response":[]}]},{"name":"⚙️ Workflow Orchestration","description":"# Workflow Orchestration\n\n**Workflow Orchestration** defines and runs multi-step AI agent workflows: templates, executions, triggers, and status tracking with KPI statistics.\n\n> **Payload variants:** Many requests in this folder share the same path **`POST /job/add/workflow`**. Each item is a **different template payload** (discriminator fields such as `template`, `idp_collection`, `ocr_mode`, `pofids`, …). Use the **Tool-ID** on each request — do not swap form bodies between tools.\n\n---\n\n## Concepts\n\n| Concept | Meaning |\n|---------|---------|\n| **Template** | Reusable definition of steps and tools |\n| **Execution** | A single run instance with inputs/outputs |\n| **Trigger** | Schedule or event starting a run |\n\nMost mutations run as **jobs** or authenticated REST depending on endpoint — see Docs per request.\n\n---\n\n## Integration\n\n- Start executions from your app after **Document AI** uploads\n- Poll execution status similarly to generic jobs\n- Combine with **HITL** when human approval is required mid-flow\n---\n\n## Shared execution model (jobs)\n\n| Concept | Detail |\n|---------|--------|\n| **Bearer token** | Required for all processing endpoints |\n| **Connection hold** | Default `client_wait=true` — hold HTTP up to about 295 s, then **200** or **202** + `poll_url` |\n| **Polling** | `GET /job/get/{job_id}` after **202** or when work exceeds the hold |\n| **Queue priority** | Optional `priority` — omit for plan default; see **Introduction & Basics → Guides** |\n\nCredit amounts are **not** duplicated here — use **`GET /job/pricelist`** or `_billing` on responses.","item":[{"name":"Create template","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/workflow_templates/add","host":["{{base_url}}"],"path":["workflow_templates","add"]},"description":"## Overview\nCreate a custom user workflow template.\n\nSend a JSON body with `name` and `steps` (array of `{id, endpoint, params}`). Legacy `nodes` / `connections` fields are not used by the API runtime.\n\n---\n**API reference:** `po-workflow-templates-create-template` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"name\": \"New workflow\",\n    \"steps\": []\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Delete template","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_templates/delete","host":["{{base_url}}"],"path":["workflow_templates","delete"]},"description":"## Overview\nDeactivate a user workflow template (soft delete).\n\nRequires `workflow_id` (aliases: `uuid`, `template_id`, `id`). Only user-owned templates can be deleted.\n\n---\n**API reference:** `po-workflow-templates-delete-template` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"uuid","type":"text","description":"Workflow template UUID from po_workflow_templates_list_templates (preferred). | Type: string","value":"","disabled":true},{"key":"template_id","type":"text","description":"Alias for uuid. | Type: string","value":"","disabled":true},{"key":"workflow_id","type":"text","description":"Legacy alias for template uuid (not system workflow id). Mapped to uuid server-side. | Type: string","value":"","disabled":true},{"key":"id","type":"text","description":"Alias for uuid. | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Execute template","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/workflow","host":["{{base_url}}"],"path":["job","add","workflow"]},"description":"## Overview\nExecute a saved workflow template via `POST /job/add/workflow`.\n\nProvide either a multipart **file** upload or a `pofid` in the body. Set `workflow_id` (alias `uuid`) to the template to run. Supports `client_wait`, `async_only`, and `priority` like other job endpoints.\n\n#### Required alternatives\n\nProvide **at least one** of: `file` **or** `pofid`.\n\n**Pipeline:** `workflow` (fixed, do not change the URL path)\n\n**Workflow discriminator (Body):**\n- `template`: `workflow` (set in Body — distinguishes this workflow job)\n\n---\n**API reference:** `po-workflow-templates-execute-template` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"uuid","type":"text","description":"Deprecated alias for workflow_id. | Type: string","value":"","disabled":true},{"key":"input_data","type":"text","description":"Optional input payload for the workflow run. | Type: object","value":"","disabled":true},{"key":"file","type":"file","description":"**ONE OF REQUIRED** | Multipart file upload (alternative to pofid). | Type: file","src":null},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true},{"key":"client_wait","type":"text","description":"*(optional)* | Connection hold: true (default) = API holds this HTTP request while the job runs, up to the dynamic pipeline timeout (priority, pages, pipeline type; minimum ~20s, infrastructure cap ~295s). Returns the finished result when ready, or HTTP 202 with job_id and poll_url if the hold is exceeded. false = immediate job_id. | Type: boolean","value":"","disabled":true},{"key":"async_only","type":"text","description":"*(optional)* | Same as client_wait=false: immediate job_id — poll GET /job/get/{job_id} every 5–10s. | Type: boolean","value":"","disabled":true},{"key":"workflow_id","type":"text","description":"Workflow template ID to execute (alias: uuid). | Type: string","value":"","disabled":true},{"key":"pofid","type":"text","description":"**ONE OF REQUIRED** | Document POFID (alternative to multipart file upload). | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Get template","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_templates/get","host":["{{base_url}}"],"path":["workflow_templates","get"]},"description":"## Overview\nLoad a single system workflow template by ID.\n\nCall `GET /workflow/system_list` first to obtain valid IDs. Pass `workflow_id` (aliases: `uuid`, `template_id`, `id`).\n\n---\n**API reference:** `po-workflow-templates-get-template` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"uuid","type":"text","description":"Deprecated alias for workflow_id. | Type: string","value":"","disabled":true},{"key":"template_id","type":"text","description":"Deprecated alias for workflow_id. | Type: string","value":"","disabled":true},{"key":"workflow_id","type":"text","description":"**REQUIRED** | System workflow ID from GET /workflow/system_list (canonical). | Type: string","value":"{{workflow_id}}"},{"key":"id","type":"text","description":"Deprecated alias for workflow_id. | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"List Workflow Templates","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/workflow_templates/list","host":["{{base_url}}"],"path":["workflow_templates","list"]},"description":"## Overview\nList user workflow templates (graph + agent templates) for the authenticated account.\n\nLegacy alias: `GET /workflow/user_list` routes to this endpoint.\n\nReturns `data[]` with template UUIDs — use `workflow_id` / `uuid` for update and delete.\n\n---\n**API reference:** `po-workflow-templates-list-templates` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Update template","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_templates/update","host":["{{base_url}}"],"path":["workflow_templates","update"]},"description":"## Overview\nUpdate an existing user workflow template.\n\nRequires `workflow_id` (aliases: `id`, `uuid`, `template_id`). Partial updates supported for `name`, `description`, and `steps`.\n\n---\n**API reference:** `po-workflow-templates-update-template` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"uuid","type":"text","description":"Workflow template UUID from po_workflow_templates_list_templates (preferred). | Type: string","value":"","disabled":true},{"key":"template_id","type":"text","description":"Alias for uuid. | Type: string","value":"","disabled":true},{"key":"workflow_id","type":"text","description":"Legacy alias for template uuid (not system workflow id). Mapped to uuid server-side. | Type: string","value":"","disabled":true},{"key":"id","type":"text","description":"Alias for uuid. | Type: string","value":"","disabled":true},{"key":"name","type":"text","description":"New template name | Type: string","value":"","disabled":true},{"key":"description","type":"text","description":"New template description | Type: string","value":"","disabled":true},{"key":"category","type":"text","description":"Workflow template category label. | Type: string","value":"","disabled":true},{"key":"trigger_type","type":"text","description":"Trigger identifier (must start with trigger_, e.g. trigger_manual). | Type: string","value":"","disabled":true},{"key":"is_active","type":"text","description":"When false, template is disabled and cannot be executed. | Type: boolean","value":"","disabled":true},{"key":"steps","type":"text","description":"Updated workflow steps ({id, endpoint, params}). | Type: array","value":"","disabled":true},{"key":"timeout_ms","type":"text","description":"Execution timeout in milliseconds | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"System templates","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/workflow/system_list","host":["{{base_url}}"],"path":["workflow","system_list"]},"description":"## Overview\nList built-in **system** workflow templates (read-only catalog).\n\n**HTTP:** `GET /workflow/system_list` or `POST /workflow/system_list` (empty body).\n\nPair with `GET /workflow/system_get` for a single template. For user-owned templates use `GET /workflow/user_list`.\n\n---\n**API reference:** `po-orchestration-list-system-templates` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]}]},{"name":"🔔 Webhooks","description":"# Webhooks\n\nConfigure **webhook endpoints** for real-time events (job completion, security blocks, domain events). Manage subscriptions, inspect delivery logs, and test connectivity.\n\n---\n\n## Setup\n\n1. Register HTTPS URL with desired event types\n2. Store signing secret securely\n3. Acknowledge deliveries with 2xx quickly; retry logic is server-side\n4. Correlate payloads using IDs in the JSON body\n\nTest handlers with the dedicated test request where available.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Create Webhook Subscription","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/webhooks/subscribe","host":["{{base_url}}"],"path":["webhooks","subscribe"]},"description":"Create a new webhook subscription. Payloads are signed with HMAC-SHA256.\n\n**Common event types:** `document.uploaded`, `document.updated`, `document.deleted`, `document.note_added`, `job.completed`, `job.failed`, or `[\"*\"]` for all events.\n\n`secret` is auto-generated when empty.\n\n---\n**API reference:** `po-webhooks-subscribe` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"name\": \"Example webhook {{$timestamp}}\",\n    \"url\": \"https:\\/\\/example.com\\/callback\",\n    \"events\": [\n        \"*\"\n    ],\n    \"retry_policy\": \"none\",\n    \"max_retries\": 5\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Delete Webhook Subscription","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/webhooks/delete","host":["{{base_url}}"],"path":["webhooks","delete"]},"description":"Delete a webhook subscription. The delivery log is preserved.\n\n---\n**API reference:** `po-webhooks-delete` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"subscription_id\": \"{{subscription_id}}\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"List Webhook Subscriptions","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/webhooks/list","host":["{{base_url}}"],"path":["webhooks","list"]},"description":"List all webhook subscriptions of the account.\n\n---\n**API reference:** `po-webhooks-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)"},"response":[]},{"name":"Test webhook","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/webhooks/test","host":["{{base_url}}"],"path":["webhooks","test"]},"description":"Send a test event to a webhook subscription to verify delivery.\n\n---\n**API reference:** `po-webhooks-test` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"subscription_id\": \"{{subscription_id}}\"\n}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Update Webhook Subscription","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/webhooks/update","host":["{{base_url}}"],"path":["webhooks","update"]},"description":"## Overview\nUpdate an existing webhook subscription (URL, events, headers, retry policy, or active flag).\n\nRequires `subscription_id` from `POST /webhooks/subscribe` or `GET /webhooks/list`.\n\n---\n**API reference:** `po-webhooks-update` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"subscription_id\": \"{{subscription_id}}\",\n    \"retry_policy\": \"none\"\n}","options":{"raw":{"language":"json"}}}},"response":[]}]},{"name":"👁️ HITL (Human-in-the-Loop)","description":"# HITL (Human-in-the-Loop)\n\n**HITL** routes AI-processed documents for manual review: claim tasks, approve or reject, manage queues with SLA tracking.\n\n---\n\n## Flow\n\n1. Upstream job (IDP, OCR, workflow) flags review required\n2. Reviewer claims item from queue\n3. Approve/reject with optional corrections\n4. Downstream automation continues based on outcome\n\nConfigure review policies in the PaperOffice app; these APIs are for integration with custom review UIs.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Approve Task (Legacy)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/hitl_review/approve","host":["{{base_url}}"],"path":["hitl_review","approve"]},"description":"Direct approve. WARNING: Blocked for consensus tasks — use submit_review.\n\n---\n**API reference:** `po-hitl-approve` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"task_uuid","type":"text","description":"**REQUIRED** | Task UUID (required). | Type: string","value":"00000000-0000-0000-0000-000000000001"},{"key":"result","type":"text","description":"Review-Ergebnis | Type: object","value":"","disabled":true}]}},"response":[]},{"name":"Claim Review Task","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/hitl_review/claim","host":["{{base_url}}"],"path":["hitl_review","claim"]},"description":"Claim a pending/awaiting_reviews task. Blind review enforced.\n\n---\n**API reference:** `po-hitl-claim` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"task_uuid","type":"text","description":"**REQUIRED** | Task UUID (required). | Type: string","value":"00000000-0000-0000-0000-000000000001"}]}},"response":[]},{"name":"Complete Task (Legacy)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/hitl_review/complete","host":["{{base_url}}"],"path":["hitl_review","complete"]},"description":"Direct complete. WARNING: Blocked for consensus tasks — use submit_review.\n\n---\n**API reference:** `po-hitl-complete` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"task_uuid","type":"text","description":"**REQUIRED** | Task UUID (required). | Type: string","value":"00000000-0000-0000-0000-000000000001"},{"key":"result","type":"text","description":"Review-Ergebnis | Type: object","value":"","disabled":true}]}},"response":[]},{"name":"HITL Health Check","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/hitl_review/check","host":["{{base_url}}"],"path":["hitl_review","check"]},"description":"Health check for HITL review service.\n\n---\n**API reference:** `po-hitl-check` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Reject Task (Legacy)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/hitl_review/reject","host":["{{base_url}}"],"path":["hitl_review","reject"]},"description":"Direct reject. WARNING: Blocked for consensus tasks — use submit_review.\n\n---\n**API reference:** `po-hitl-reject` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"task_uuid","type":"text","description":"**REQUIRED** | Task UUID (required). | Type: string","value":"00000000-0000-0000-0000-000000000001"},{"key":"reason","type":"text","description":"Ablehnungsgrund | Type: string","value":"","disabled":true}]}},"response":[]}]},{"name":"✅ Tasks & Substitutes","description":"# Tasks & Substitutes\n\nManage **tasks** (create, assign, complete) and **substitution rules** for automatic delegation during absence.\n\n---\n\n## Use cases\n\n- Operational task queues for clerks\n- Out-of-office rerouting of approvals to deputies\n- Link tasks to documents via references in request bodies\n\nEndpoints are primarily **direct REST** with JSON bodies unless marked as job-based in Docs.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Claim task","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_tasks/claim","host":["{{base_url}}"],"path":["workflow_tasks","claim"]},"description":"Claim an open workflow task for the authenticated user.\n\n---\n**API reference:** `po-tasks-claim-task` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"task_id","type":"text","description":"ID of the task | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Complete task","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_tasks/complete","host":["{{base_url}}"],"path":["workflow_tasks","complete"]},"description":"Mark a task as completed\n\n---\n**API reference:** `po-tasks-complete-task` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"task_id","type":"text","description":"ID of the task | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Escalate workflow task","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_tasks/escalate","host":["{{base_url}}"],"path":["workflow_tasks","escalate"]},"description":"Escalates a workflow task to the next approval level.\n\n---\n**API reference:** `po-tasks-escalate-task` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"formdata","formdata":[{"key":"task_uuid","type":"text","description":"**REQUIRED** | Workflow task UUID to escalate. | Type: string","value":"00000000-0000-0000-0000-000000000001"},{"key":"reason","type":"text","description":"Human-readable escalation reason for the audit trail. | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Get task details","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_tasks/get","host":["{{base_url}}"],"path":["workflow_tasks","get"]},"description":"Return full details for a single workflow task by ID.\n\n---\n**API reference:** `po-tasks-get-task-details` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"task_id","type":"text","description":"ID of the task | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"List my tasks","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_tasks/list","host":["{{base_url}}"],"path":["workflow_tasks","list"]},"description":"List all tasks of the current user\n\n---\n**API reference:** `po-tasks-list-my-tasks` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"status","type":"text","description":"Filter after Status | Type: string | Allowed: pending, in_progress, completed, rejected, expired, escalated","value":"","disabled":true},{"key":"priority","type":"text","description":"Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: string | Allowed: low, normal, high, urgent","value":"","disabled":true},{"key":"step_type","type":"text","description":"Filter after Step-type (e.g. approval, review, manual_input) | Type: string","value":"","disabled":true},{"key":"limit","type":"text","description":"Max. Tasks | Type: integer | Min: 1 | Max: 100","value":"","disabled":true},{"key":"offset","type":"text","description":"Pagination-Offset | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"Mark Task Read","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_tasks/mark_read","host":["{{base_url}}"],"path":["workflow_tasks","mark_read"]},"description":"Mark a task as read\n\n---\n**API reference:** `po-tasks-mark-as-read` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"task_id","type":"text","description":"ID of the task | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Reject workflow task","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_tasks/reject","host":["{{base_url}}"],"path":["workflow_tasks","reject"]},"description":"Rejects a workflow or approval task.\n\n---\n**API reference:** `po-tasks-reject-task` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"formdata","formdata":[{"key":"task_uuid","type":"text","description":"**REQUIRED** | Workflow task UUID to reject. | Type: string","value":"00000000-0000-0000-0000-000000000001"},{"key":"reason","type":"text","description":"Human-readable rejection reason for the audit trail. | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Release workflow task claim","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_tasks/release","host":["{{base_url}}"],"path":["workflow_tasks","release"]},"description":"Releases a claimed workflow task back to the shared inbox.\n\n---\n**API reference:** `po-tasks-release-task` (documentation ID; not a `/job/add/` pipeline slug)","body":{"mode":"formdata","formdata":[{"key":"task_uuid","type":"text","description":"**REQUIRED** | Workflow task UUID to release back to the queue. | Type: string","value":"00000000-0000-0000-0000-000000000001"}]}},"response":[]},{"name":"Resolve task","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/workflow_tasks/resolve","host":["{{base_url}}"],"path":["workflow_tasks","resolve"]},"description":"Resolves a human or HITL task via the canonical platform endpoint `/workflow_tasks/resolve` (approve, reject, escalate).\n\n---\n**API reference:** `po-tasks-resolve-task` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"task_uuid","type":"text","description":"**REQUIRED** | UUID of the human-in-the-loop (HITL) task. | Type: string","value":"00000000-0000-0000-0000-000000000001"},{"key":"decision","type":"text","description":"**REQUIRED** | Reviewer decision (`approve`, `reject`, `escalate`, `postpone`). | Type: string | Allowed: approve, reject, escalate, postpone","value":"approve"},{"key":"comment","type":"text","description":"Optional comment. | Type: string","value":"","disabled":true},{"key":"reject_comment","type":"text","description":"Rejection comment (when decision is `reject`). | Type: string","value":"","disabled":true},{"key":"reject_reason_id","type":"text","description":"Rejection reason ID. | Type: string","value":"","disabled":true},{"key":"field_results","type":"text","description":"HITL field review results | Type: array","value":"","disabled":true},{"key":"check_results","type":"text","description":"HITL binary check results. | Type: array","value":"","disabled":true},{"key":"claim_session_id","type":"text","description":"Claim session ID for parallel review locking. | Type: string","value":"","disabled":true}]}},"response":[]}]},{"name":"👥 User Groups","description":"# User Groups\n\nManage **workspace user groups** for Headless DMS: list groups, create/update/delete groups, and assign members with role-based access inside a workspace.\n\nUse these endpoints after you have a valid `workspace_id` from workspace list/create. Group IDs from `list` are required for `get`, `update`, and `delete`.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.","item":[{"name":"Groups: Get Group Details","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/user_groups/get","host":["{{base_url}}"],"path":["user_groups","get"]},"description":"Get detailed information about a specific group including settings and members.\n\n---\n**API reference:** `po-groups-get` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"group_id","type":"text","description":"**REQUIRED** | ID of the group | Type: integer","value":"1"}]}},"response":[]},{"name":"Groups: Get Group Members","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/user_groups/get_members","host":["{{base_url}}"],"path":["user_groups","get_members"]},"description":"Get all members of a specific group with their profile information.\n\n---\n**API reference:** `po-groups-get-members` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"group_id","type":"text","description":"**REQUIRED** | ID of the group | Type: integer","value":"1"}]}},"response":[]},{"name":"Groups: Get My Groups","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"url":{"raw":"{{base_url}}/user_groups/get_user_groups","host":["{{base_url}}"],"path":["user_groups","get_user_groups"]},"description":"Get all groups the currently authenticated user belongs to.\n\n---\n**API reference:** `po-groups-get-user-groups` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[]},{"name":"Groups: List All Groups","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"url":{"raw":"{{base_url}}/user_groups/list","host":["{{base_url}}"],"path":["user_groups","list"]},"description":"List all user groups in the organization with member count, settings, and metadata.\n\n---\n**API reference:** `po-groups-list` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[]}]}]},{"name":"🎨 Media AI","description":"# Media AI\n\nPaperOffice **Media AI** groups **image generation**, **voice synthesis & transcription**, and **multilingual text translation** in one product area. This folder contains **nine** curated Postman requests across **three** sub-modules.\n\nPer-request credit costs are **not** duplicated here — use **`GET /job/pricelist`**, the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator), or `_billing` on live responses.\n\n---\n\n## Sub-modules (where to click)\n\n| Sub-module | Postman folder | Use when you need |\n|------------|----------------|-------------------|\n| **Image Studio** | Image Studio | Text-to-image, background removal |\n| **Voice** | Voice | TTS (catalog, clone, multi-speaker), STT |\n| **Translation** | Translation | Language catalog, translate string/array/JSON |\n\nEach sub-folder has its **own detailed overview** — open **Image Studio**, **Voice**, or **Translation** for parameters, demos, and module-specific best practices.\n\n---\n\n## All requests in this section (9)\n\n| # | Sub-module | Postman request | API pattern |\n|---|------------|-----------------|-------------|\n| 1 | Image Studio | `POST` Generate image | Job + **form-data** |\n| 2 | Image Studio | `POST` Remove background | Job + **form-data** (file upload) |\n| 3 | Voice | `POST` List available TTS voices | Direct REST (catalog) |\n| 4 | Voice | `POST` Generate speech (single voice) | Job + **form-data** |\n| 5 | Voice | `POST` Clone voice (TTS) | Job + **form-data** (audio sample) |\n| 6 | Voice | `POST` Generate multi-speaker TTS | Job + **form-data** |\n| 7 | Voice | `POST` Transcribe audio | Job + **form-data** (audio file) |\n| 8 | Translation | `GET` Get supported languages | Direct REST (catalog) |\n| 9 | Translation | `POST` Translate text | Direct REST + **JSON body** |\n\n---\n\n## Two API surfaces (important)\n\nMost Media AI work uses **jobs**; Translation uses a **dedicated REST** surface:\n\n| Pattern | Endpoints | Postman body | Typical use |\n|---------|-----------|--------------|-------------|\n| **Job pipelines** | `POST /job/add/{handler}___…` | **form-data** (often includes **files**) | Images, TTS, STT |\n| **Translation REST** | `GET /translate/languages`, `POST /translate/text` | **raw JSON** for `/translate/text` | Text, arrays, i18n JSON objects |\n\n**Why Translation is JSON:** `text` can be a **string**, **string[]**, or **JSON object** — not representable cleanly as multipart form-data. Image and voice jobs need **binary uploads** — form-data is the right fit there.\n\n**Under the hood:** Translation still uses the **same Jobstream engine** (`paperoffice_ai___process`, priority, queue, `job_id`, poll) — only the **public URL and request shape** differ. See **Translation** folder docs for details.\n\n---\n\n## Shared execution model (jobs & hybrid translate)\n\n| Concept | Applies to |\n|---------|------------|\n| **Bearer token** | All requests |\n| **`_billing` in JSON responses** | Billed calls (catalog may be UI-free in the app) |\n| **Connection hold** (`client_wait`, default on) | Jobs + `POST /translate/text` — wait up to **about 295 s**, then **200** or **202** + `poll_url` |\n| **Queue priority** (`priority`, optional) | Jobs + translate — omit = plan default; **≥ 900** = synchronous attempt when capacity allows |\n| **Polling** | `GET /job/get/{job_id}` after **HTTP 202** or when async |\n\nLong work can exceed the HTTP hold — the **job keeps running**; poll until `job_status` is `completed` or `failed`.\n\n---\n\n## Typical cross-module workflows\n\n1. **Marketing asset:** **Generate image** → optional **Remove background** → use URL/`inline` output in your app.\n2. **Voiceover:** **List available TTS voices** → **Generate speech** (or clone / multi-speaker) → download from `inline`/`url`.\n3. **Meeting notes:** **Transcribe audio** → take transcript text → **Translate text** to target language(s).\n4. **i18n product copy:** **Get supported languages** (cache 35 codes + `target_locale` variants) → **Translate text** with JSON object `text` → read `translated_json`.\n\n---\n\n## Billing overview (high level)\n\n| Area | Billing unit (typical) |\n|------|-------------------------|\n| Image Studio | Per job (tier/model/size); see request docs |\n| Voice TTS | Per job (quality tier, characters) |\n| Voice STT | Per job (audio duration / tier) |\n| Translation catalog | **1 credit** per API call (`GET /translate/languages`) |\n| Translation text | Per **character volume** × **tier** (`basic` / `premium` / `ultra`) |\n\n---\n\n## Queue priority & connection hold\n\nThese are **independent** (see **Introduction & Basics → Guides → Priority, Jobs & Connection Hold**):\n\n| Concept | What it controls |\n|---------|------------------|\n| **Connection hold** | How long **this HTTP request** waits (about **295 s** max) |\n| **Queue priority** | How soon processing **starts** in the worker queue (and credit tier) |\n\nLeave **`priority` unchecked** in Postman unless you intentionally need a higher tier or **`900`** for stream-style completion.\n\n---\n\n## Best practices (Media AI-wide)\n\n1. Open the **sub-folder** that matches your task — do not mix Image parameters into Translation requests.\n2. For any **job** that returns **HTTP 202**, **poll** `GET /job/get/{job_id}` — do not resubmit the same payload unless the job failed.\n3. For **Translation**, always call **Get supported languages** first (or cache it) — do not hardcode language lists.\n4. Use **`output=url`** in production integrations for large binaries; **`inline`** for quick Postman checks.\n5. Split payloads that exceed module limits (e.g. **15 000 characters** per translate request) **client-side**.\n\n---\n\n## MCP vs Postman\n\nThe full API catalog may list additional tool IDs (per image tier, legacy translate names, etc.). This Postman section exposes **nine masters** only — the supported integration path for external developers.\n\n---\n\n## Next steps\n\n| Goal | Open folder |\n|------|-------------|\n| Images | **Image Studio** |\n| Speech in / out | **Voice** |\n| Languages & text | **Translation** |","item":[{"name":"🎨 Image Studio","description":"# Image Studio\n\nPaperOffice **Image Studio** provides **text-to-image generation** and **background removal** via two job pipelines.\n\n---\n\n## What you can do\n\n| Capability | Postman request | Pipeline |\n|------------|-----------------|----------|\n| **Generate image** | `POST` Generate image | `paperoffice_imagestudio___generate` |\n| **Remove background** | `POST` Remove background | `paperoffice_imagestudio___remove_bg` |\n\nThere are **only two public job types** — all options (model tier, size, output mode, batch count, prompt optimizer, etc.) are **parameters on these requests**, not separate endpoints.\n\n---\n\n## Generate image (text-to-image)\n\n- **Default Postman demo:** photorealistic portrait, woman holding a sign with legible **Tokyo**, `force_location=Tokyo`, weather + prompt optimizer enabled — showcases text, realism, and geo context in one click.\n- **Prompt** (required) describes the scene.\n- **`model`** selects the resolution tier: `basic` (512), `premium` (1280), `ultra` (2048).\n- **`width` / `height`** optional; clamped to tier and 16 px grid.\n- **`output`:** `inline` (default), `base64`, or `url` — **one parameter**, not separate Postman examples.\n- **`precompile_prompt`:** AI optimizes your prompt (default `true`).\n- **`inject_weather`**, **`force_location`:** optional scene context for the prompt optimizer (see Generate image docs).\n- **`num_images`:** 1–8 images per job.\n- **`negative_prompt`**, **`seed`** for control and reproducibility.\n\nInference quality settings are fixed per model tier and are not exposed as request fields.\n\n---\n\n## Remove background\n\n- Upload **`file`** (multipart).\n- **`output_format`:** `webp` or `png`.\n- **`output`:** `inline` (default), `base64`, or `url` — same delivery modes as generate.\n\n---\n\n## Typical workflow\n\n1. **Generate:** `POST /job/add/paperoffice_imagestudio___generate` with `prompt` + `model`.\n2. **Or edit:** `POST /job/add/paperoffice_imagestudio___remove_bg` with `file`.\n3. On **HTTP 202**, poll **`GET /job/get/{job_id}`** until done.\n\n---\n\n## Connection hold vs queue priority\n\n| Concept | Role |\n|---------|------|\n| **Connection hold** | Waits on this HTTP call up to **about 295 s**, then result or **202** + poll |\n| **Queue priority** | Optional **1–900**; **`900`** = stream/synchronous |\n\n---\n\n## Best practices\n\n1. Use **Generate image** for all text-to-image cases — change `model`/`output` in the form, do not duplicate requests.\n2. Use **Remove background** for cut-outs — set `output` in the same request.\n3. Leave **`priority` unchecked** unless you need a higher tier or **`900`** for stream mode.\n4. Prefer **`output=url`** in integrations; **`inline`** for quick visual checks in Postman.\n\n---\n\n## Related modules\n\nOpen the parent folder **Media AI** for the **full section map** (all nine requests, JSON vs form-data, shared job model). Under **Media AI**: **Voice**, **Translation**. Tier-specific MCP tool IDs may still exist in the API catalog; the Postman collection exposes the **two masters** above.","item":[{"name":"Generate image","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_imagestudio___generate","host":["{{base_url}}"],"path":["job","add","paperoffice_imagestudio___generate"]},"description":"## Overview\nGenerate images from a text **prompt** using PaperOffice **Image Studio**.\n\nUse this endpoint for **text-to-image** jobs. Set `model` to control the maximum resolution tier; use `output` to choose how the result is returned.\n\n**Pipeline:** `paperoffice_imagestudio___generate`\n\n## Model tiers (size limits)\n\nAll tiers share the same Image Studio capability; limits are **maximum width/height** (snapped to a **16 px grid**, minimum 512 px per side):\n\n| `model` | Max size | Typical use |\n|---------|----------|-------------|\n| `basic` | 512×512 | Icons, thumbnails, fast drafts |\n| `premium` | 1280×1280 | Web graphics, presentations (default) |\n| `ultra` | 2048×2048 | Print-ready, large hero images |\n\nOversized `width`/`height` values are clamped to the selected tier.\n\n## Request parameters\n| Parameter | Required | Default | Notes |\n|-----------|----------|---------|-------|\n| `prompt` | yes | — | Text description of the image to generate. |\n| `model` | no | `premium` | `basic`, `premium`, or `ultra` (see table above). |\n| `width` | no | tier default | Pixels (128–2048), snapped to 16 px grid. |\n| `height` | no | tier default | Same as `width`. |\n| `output` | no | `inline` | `inline` (raw image bytes in HTTP body), `base64` (embedded in JSON), `url` (download link in JSON). |\n| `precompile_prompt` | no | `true` | `true` = AI prompt optimizer; `false` = use your exact wording (recommended with fixed `seed`). |\n| `num_images` | no | `1` | Generate 1–8 images in one job (each image is a separate unit in the result). |\n| `negative_prompt` | no | — | Elements to avoid (e.g. `blurry, watermark, text`). |\n| `seed` | no | random | Fixed integer ≥ 0 for reproducibility; use with `precompile_prompt=false`. |\n| `priority` | no | plan default | Leave **unchecked** in Postman. |\n\n## Prompt context (optional)\n\nWhen `precompile_prompt=true` (default), Image Studio may enrich the scene using location and weather context:\n\n| Parameter | Required | Default | Notes |\n|-----------|----------|---------|-------|\n| `inject_weather` | no | `true` | `true` = include local weather in the optimized prompt; `false` = omit weather hints. |\n| `force_location` | no | — | City/region name **or** IP address. Overrides automatic geo detection from the request. If omitted, the caller IP is used when available. |\n\n**Automatic (not a Postman field):** Client IP is taken from the HTTP request when `force_location` is empty — no need to send `user_ip` manually.\n\n**Fixed inference profile:** quality settings are fixed per model tier and are not customer-configurable via the API.\n\n## Connection hold\n& polling (about 5 minute limit)\n\n- **Default:** This HTTP request is held up to **about 5 minutes (about 295 s)**; then **200** or **202** + `poll_url`.\n- **Poll:** `GET /job/get/{job_id}` every 5–10 s after **202** until `job_status` is `completed` or `failed`.\n- **Immediate job id:** Send `client_wait=false` or `async_only=true` in the JSON request body to receive `job_id` immediately, then poll **`GET /job/get/{job_id}`**.\n\n## Queue priority\n(optional)\n\n- **Omitted / unchecked** → subscription plan default.\n- **1–899** → faster queue start on busy workers.\n- **`900`** → synchronous / stream on this connection.\n- Valid range: **1–900**.\n\n## Related endpoint\n\n| Use case | Postman item |\n|----------|----------------|\n| Remove background from an existing image | Remove background |\n\n**Pipeline:** `paperoffice_imagestudio___generate` (fixed, do not change the URL path)\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n*Documentation release: `R20260721.1103`* · status: `frozen`","body":{"mode":"formdata","formdata":[{"key":"prompt","type":"text","description":"**REQUIRED** | Text description of the image to generate (required). Default demo: photorealistic portrait with legible \"Tokyo\" sign — pair with force_location=Tokyo. | Type: string","value":"Photorealistic street portrait of a woman in her early thirties, upper body, holding a handmade cardboard sign at chest height. The sign must display the word \"Tokyo\" in large, bold, perfectly legible black letters. Natural daylight, candid travel photography, shallow depth of field, 35mm lens, realistic skin texture, sharp focus on face and sign."},{"key":"model","type":"text","description":"Resolution tier: basic (max 512×512), premium (max 1280×1280), ultra (max 2048×2048). Default: premium. | Type: string | Allowed: basic, premium, ultra","value":"premium"},{"key":"width","type":"text","description":"Width in pixels (snapped to 16 px grid, clamped to model tier). Optional. | Type: integer | Min: 128 | Max: 2048","value":"896"},{"key":"height","type":"text","description":"Height in pixels (snapped to 16 px grid, clamped to model tier). Optional. | Type: integer | Min: 128 | Max: 2048","value":"1152"},{"key":"output","type":"text","description":"**REQUIRED** | Delivery mode: `inline` (binary HTTP body), `base64`, or `url`. When `output` is `inline` or `base64`, set `client_wait=true` (default) — otherwise HTTP 400 `CLIENT_WAIT_REQUIRED`. | Type: string","value":"inline"},{"key":"precompile_prompt","type":"text","description":"true = AI prompt optimizer (default). false = use exact prompt (pair with fixed seed for reproducibility). | Type: string | Allowed: true, false","value":"true"},{"key":"inject_weather","type":"text","description":"true = include local weather in prompt optimizer (default). false = omit weather context. | Type: string | Allowed: true, false","value":"true"},{"key":"force_location","type":"text","description":"Optional. City/region name or IP. Default demo: Tokyo (pairs with the sign text in the default prompt). | Type: string","value":"Tokyo"},{"key":"num_images","type":"text","description":"Number of images to generate in one job (1–8). Each image is processed as a separate unit in the job result. | Type: integer | Min: 1 | Max: 8","value":"1"},{"key":"negative_prompt","type":"text","description":"Optional. Elements to exclude (e.g. blurry, misspelled letters, distorted typography). | Type: string","value":"blurry, low quality, watermark, misspelled letters, distorted typography"},{"key":"seed","type":"text","description":"Optional. Fixed seed ≥ 0 for reproducibility; omit or -1 for random. Use with precompile_prompt=false. | Type: integer","value":"-1"},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"Remove background","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_imagestudio___remove_bg","host":["{{base_url}}"],"path":["job","add","paperoffice_imagestudio___remove_bg"]},"description":"## Overview\nRemove the background from an uploaded image using PaperOffice **Image Studio** (AI segmentation).\n\nReturns a transparent or clean foreground subject. Use when you already have an image file and need a cut-out for compositing or product shots.\n\n**Pipeline:** `paperoffice_imagestudio___remove_bg`\n\n## Request parameters\n| Parameter | Required | Default | Notes |\n|-----------|----------|---------|-------|\n| `file` | yes | — | Image upload: JPEG, PNG, WebP, GIF, BMP (multipart). |\n| `output_format` | no | `webp` | `webp` (smaller) or `png` (lossless transparency). |\n| `output` | no | `inline` | `inline` (raw image in HTTP body), `base64`, or `url` (download link in JSON). |\n| `segmentation_profile` | no | `standard` | Optional segmentation quality profile: `standard`, `portrait`, or `general`. Invalid values fall back to default. |\n| `priority` | no | plan default | Leave **unchecked** in Postman. |\n\n## Connection hold\n& polling\n\nSame as other job endpoints: when **`client_wait` is omitted** (recommended) or `client_wait=true`, the API keeps the HTTP connection open up to **about 295 s** and returns the finished image (or **202** with `poll_url` if processing takes longer). Set `client_wait=false` or `async_only=true` for immediate `job_id` + polling only.\n\n## Queue priority\n(optional)\n\nValid range **1–900**. **`900`** = synchronous / stream. Omit for plan default.\n\n## Related endpoint\n\n| Use case | Postman item |\n|----------|----------------|\n| Generate new images from text | Generate image |\n\n**Pipeline:** `paperoffice_imagestudio___remove_bg` (fixed, do not change the URL path)\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n*Documentation release: `R20260721.1103`* · status: `frozen`","body":{"mode":"formdata","formdata":[{"key":"file","type":"file","description":"**REQUIRED** | Image file to process (required). JPEG, PNG, WebP, GIF, BMP. | Type: file (binary)","src":null},{"key":"output_format","type":"text","description":"Output format: webp (default, smaller) or png (lossless transparency). | Type: string | Allowed: webp, png","value":"webp"},{"key":"output","type":"text","description":"**REQUIRED** | Delivery mode: `inline` (binary HTTP body), `base64`, or `url`. When `output` is `inline` or `base64`, set `client_wait=true` (default) — otherwise HTTP 400 `CLIENT_WAIT_REQUIRED`. | Type: string","value":"inline"},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true}]}},"response":[]}]},{"name":"🎤 Voice","description":"# Voice\n\nPaperOffice **Voice AI** covers neural **text-to-speech (TTS)** and **speech-to-text (STT)** in one place. All TTS jobs share the same pipeline URL; the request body selects the mode.\n\n---\n\n## What you can do\n\n| Capability | Postman request | When to use |\n|------------|-----------------|-------------|\n| **Browse catalog voices** | `POST` List available TTS voices | Before any TTS job — pick `name` + language bucket |\n| **Single-speaker TTS** | `POST` Generate speech (single voice) | One catalog voice; default demo script shows emotions + reference IDs |\n| **Clone a custom voice** | `POST` Clone voice (TTS) | Voice not in catalog — upload `voice_sample` (min. **10 s** audio) |\n| **Multi-speaker TTS** | `POST` Generate multi-speaker TTS | Several catalog speakers in one text (`voice=Multi` + tags) |\n| **Transcribe audio** | `POST` Transcribe audio | STT — audio file → text (speaker detection where supported) |\n\n**Languages:** 50+ TTS catalog buckets (e.g. `en`, `de`, `fr`). List exact pairs via **List available TTS voices**.\n\n**Output formats (TTS):** `mp3`, `wav`, `ogg`. **Delivery:** `inline` (audio in HTTP body), `base64`, or `url` in JSON.\n\n**Quality (TTS):** `basic` (fast), `premium` (balanced), `ultra` (best). Voice cloning requires **`premium`** or **`ultra`**.\n\n---\n\n## Shared pipeline (TTS)\n\nAll four TTS endpoints use:\n\n```http\nPOST /job/add/paperoffice_voice___tts\n```\n\nOnly the **form body** differs (catalog `voice` vs `voice_sample` vs `voice=Multi`, etc.). STT uses its own pipeline (see **Transcribe audio**).\n\n---\n\n## Typical workflow\n\n1. **`POST /voice/voices`** — list voices; choose `name` and matching `language`.\n2. **`POST /job/add/paperoffice_voice___tts`** — generate audio (or clone / multi-speaker variant).\n3. If the response is **HTTP 202** — poll **`GET /job/get/{job_id}`** every 5–10 s until `job_status` is `completed` or `failed` (job keeps running after the connection hold ends).\n\nFor STT, upload audio on **Transcribe audio** (separate pipeline) and poll the same way when needed.\n\n---\n\n## Connection hold vs queue priority\n\nThese are **independent**:\n\n| Concept | What it controls |\n|---------|------------------|\n| **Connection hold** (`client_wait`, default **on**) | How long **this HTTP request** waits (about **5 minutes / about 295 s** max), then **200** result or **202** + `poll_url` |\n| **Queue priority** (`priority`, optional) | How soon the job **starts in the worker queue** (billing/speed tier) |\n\nLong synthesis can exceed 5 minutes — only the **HTTP wait** is capped; use polling after **202**.\n\n---\n\n## Queue priority (optional)\n\n- **Omitted / unchecked in Postman** → your subscription **plan default** (from bearer token tier).\n- **1–899** → higher values typically mean **faster queue start** on busy workers (higher credit tier).\n- **`900`** → **synchronous / stream** mode — the API processes on this connection (not a value above the queue maximum).\n- Valid range: **1–900** (values above 900 are not supported).\n\nSee **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** for queue priority and connection-hold details.\n\n---\n\n## Text preparation (TTS)\n\n- **German (`language=de`):** dates and common German business identifiers in `text` are normalized for natural speech.\n- **Other languages:** standard number and identifier handling for the selected `language` bucket.\n- **Long text:** up to **50,000 characters** per job — submit as one request unless you intentionally want separate jobs.\n\n---\n\n## Best practices\n\n1. Always **list voices** before the first catalog TTS call.\n2. Keep **`voice`** and **`language`** in the **same catalog bucket** to avoid `warnings[]`.\n3. Leave **`priority` unchecked** unless you intentionally need a higher queue tier or **`900`** for stream-style waiting.\n4. Use **`output=inline`** in Postman to hear TTS audio directly in the response body.\n5. After **HTTP 202**, **poll** — do not resubmit the same job unless it failed.\n6. For cloning: clean **mono** sample, **≥10 s** speech, **`premium`** or **`ultra`** only.\n\n---\n\n## Related modules\n\nOpen the parent folder **Media AI** for the **full section map** (all nine requests, JSON vs form-data, shared job model). Under **Media AI** you also have **Image Studio** and **Translation**. Per-request pricing is not duplicated in this folder overview.","item":[{"name":"Transcribe audio","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_voice___stt","host":["{{base_url}}"],"path":["job","add","paperoffice_voice___stt"]},"description":"## Overview\nTranscribe uploaded **audio** to text (Speech-to-Text) via `paperoffice_voice___stt`.\n\nSupports plain JSON transcripts plus subtitle/diarization formats on higher tiers. This is a **job** endpoint (async-capable with connection hold), not an instant REST call.\n\n**Pipeline:** `paperoffice_voice___stt`.\n\n## Request parameters\n| Parameter | Required | Default | Notes |\n|-----------|----------|---------|-------|\n| `audio_file` | yes | — | Multipart audio upload. Common formats: MP3, WAV, M4A, FLAC, OGG, WebM, AAC. |\n| `quality` | no | `basic` | `basic` (plain transcript), `premium` (timestamps, SRT/VTT), `ultra` (speaker diarization, RTTM). |\n| `output_format` | no | `json` | `json`, `srt`, `vtt`, `rttm` — tier restrictions apply (see table below). |\n| `language` | no | *(auto)* | **Optional.** ISO code (`de`, `en`, …) or **omit** — the engine auto-detects the spoken language. |\n| `priority` | no | plan default | Leave **unchecked** in Postman. |\n\n### Quality vs output_format\n\n| output_format | basic | premium | ultra |\n|---------------|-------|---------|-------|\n| `json` | yes | yes | yes |\n| `srt`, `vtt` | no | yes | yes |\n| `rttm` (diarization) | no | no | yes |\n\n## Connection hold\n& polling (about 5 minute limit)\n\nSame hybrid model as TTS jobs: default wait on this request up to about 295s, then poll `GET /job/get/{job_id}` for long files.\n\n## Queue priority\n(optional)\n\nOmit in Postman for plan default. Higher values start sooner in the queue.\n\n## Related endpoints\n\n| Use case | Postman item |\n|----------|----------------|\n| Text-to-speech | Generate speech / Clone / Multi-speaker |\n| Voice names for TTS | List available TTS voices |\n\n**Pipeline:** `paperoffice_voice___stt` (fixed, do not change the URL path)\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n*Documentation release: `R20260721.1103`* · status: `frozen`","body":{"mode":"formdata","formdata":[{"key":"audio_file","type":"file","description":"**REQUIRED** | Audio file upload (required). MP3, WAV, M4A, FLAC, OGG, WebM, AAC. | Type: file (binary)","src":null},{"key":"quality","type":"text","description":"Tier: basic (JSON transcript), premium (timestamps, SRT/VTT), ultra (speaker diarization, RTTM). | Type: string | Allowed: basic, premium, ultra","value":"basic"},{"key":"output_format","type":"text","description":"json (all tiers), srt/vtt (premium+), rttm (ultra only). Default: json. | Type: string | Allowed: json, srt, vtt, rttm","value":"json"},{"key":"language","type":"text","description":"Optional ISO language (de, en, …). Omit for auto-detection. | Type: string","value":"en"},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"Clone voice (TTS)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_voice___tts","host":["{{base_url}}"],"path":["job","add","paperoffice_voice___tts"]},"description":"## Overview\nClone a **custom voice** from a short audio sample and speak new text with PaperOffice neural TTS.\n\nUse this endpoint when you need a voice that is **not** in the catalog (`POST /voice/voices`). Upload `voice_sample` instead of setting `voice`.\n\n**Pipeline:** `paperoffice_voice___tts` (same URL as catalog TTS — body differs).\n\n**Tier requirement:** `quality` must be **`premium`** or **`ultra`**. `basic` is rejected for voice cloning.\n\n## Prerequisites\n1. Prepare a **clean voice sample**: **minimum 10 seconds**, recommended **15–30 seconds** of continuous single-speaker speech (max 10 MB).\n2. Do **not** set catalog `voice` — clone mode is triggered by `voice_sample`.\n3. Optional: `language` (`en`, `de`, …) or `auto` — omit or use `auto` for detection from the sample.\n4. **Strongly recommended:** `reference_text` — transcript of what is spoken in `voice_sample` (improves clone quality).\n\n## Request parameters\n| Parameter | Required | Default | Notes |\n|-----------|----------|---------|-------|\n| `text` | yes | — | Up to 50,000 characters. Emotion markers: `[chuckle]`, `[laugh]`, `[sigh]`, `[whisper]`, `[happy]`, `[excited]`. |\n| `voice_sample` | yes | — | Multipart audio (min. **10 s**, recommended 15–30 s). WAV, MP3, OGG, FLAC, M4A, WebM, AAC. |\n| `reference_text` | no | — | Transcript of `voice_sample` (max 2,000 chars). **Strongly recommended.** Alias: `voice_sample_text`. |\n| `quality` | no | `premium` | **`premium`** or **`ultra` only**. |\n| `output_format` | no | `mp3` | `mp3`, `wav`, `ogg`. |\n| `output` | no | `inline` | `inline` (audio in HTTP body), `base64`, or `url`. |\n| `language` | no | `auto` | Optional. Omit or `auto` to detect from the **text to speak**; or set `en`, `de`, etc. for explicit output language. |\n| `priority` | no | plan default | Leave **unchecked** in Postman. |\n\n## Connection hold\n& polling (about 5 minute limit)\n\n- Default: wait on this request up to **about 295 seconds**, then result or **HTTP 202**.\n- Poll `GET /job/get/{job_id}` after **202** until `job_status` is `completed` or `failed`.\n\n## Queue priority\n(optional)\n\nHigher priority = faster queue start. Omit for plan default. Does not extend the HTTP hold window.\n\n## Related endpoints\n\n| Use case | Postman item |\n|----------|----------------|\n| Catalog voice | List available TTS voices → Generate speech (single voice) |\n| Multi-speaker | Generate multi-speaker TTS |\n\n**Pipeline:** `paperoffice_voice___tts` (fixed, do not change the URL path)\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n*Documentation release: `R20260721.1103`* · status: `frozen`","body":{"mode":"formdata","formdata":[{"key":"text","type":"text","description":"**REQUIRED** | Text to speak (max 50,000 characters). Inline emotion markers: [chuckle] [laugh] [sigh] [breath] [whisper] [happy] [excited]. Default demo after voice_sample upload. | Type: string","value":"[happy] This is your cloned voice on PaperOffice neural TTS. [breath] Support ticket TCK-88421 is now marked resolved. [excited] Record one clean sample, then narrate any new script with emotions like [sigh] or [whisper] — no extra studio session required."},{"key":"voice_sample","type":"file","description":"**REQUIRED** | Voice sample audio file (required). Minimum 10 seconds, recommended 15–30 s, clean single-speaker speech, max 10 MB. WAV, MP3, OGG, FLAC, M4A, WebM, AAC. | Type: file (binary)","src":null},{"key":"reference_text","type":"text","description":"Transcript of the spoken content in voice_sample (strongly recommended for clone quality). Max 2,000 characters. Alias: voice_sample_text. | Type: string","value":"Welcome to PaperOffice. This is the spoken content of my voice sample for cloning."},{"key":"quality","type":"text","description":"Quality tier: premium (balanced) or ultra (best). Basic is NOT supported for cloning. | Type: string | Allowed: premium, ultra","value":"premium"},{"key":"output_format","type":"text","description":"Audio format: mp3, wav, ogg. Default: mp3. | Type: string | Allowed: mp3, wav, ogg","value":"mp3"},{"key":"output","type":"text","description":"**REQUIRED** | Delivery mode: `inline` (binary HTTP body), `base64`, or `url`. When `output` is `inline` or `base64`, set `client_wait=true` (default) — otherwise HTTP 400 `CLIENT_WAIT_REQUIRED`. | Type: string","value":"inline"},{"key":"language","type":"text","description":"Language of the output text (optional). Omit or use auto to detect from the text to speak — not from the voice sample. | Type: string","value":"auto"},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"Generate multi-speaker TTS (inline tags)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_voice___tts","host":["{{base_url}}"],"path":["job","add","paperoffice_voice___tts"]},"description":"## Overview\nGenerate speech with **multiple catalog speakers** in one job using inline **speaker tags** (PaperOffice neural TTS).\n\nSet `voice=Multi` and mark who speaks which line. Speaker names must exist in `POST /voice/voices` (same language buckets as in the tags).\n\n**Pipeline:** `paperoffice_voice___tts` (same URL as single-voice TTS).\n\n## Prerequisites\n1. Call **`POST /voice/voices`** and note exact `name` values (e.g. `Abigail`, `James`).\n2. Tag **every** spoken segment — untagged text fails validation in multi mode.\n3. Set top-level `language` (e.g. `en`) — **required** by the API (validates the job bucket) even when tags include per-line language hints.\n\n## Speaker tag syntax (three forms)\n\n| Style | Example |\n|-------|---------|\n| Legacy XML | `<Abigail>Hello</Abigail><James>Hi there</James>` |\n| Shorthand | `[en\\\\|Abigail] Hello [en\\\\|James] Hi there` |\n| Key-Value | `[voice:Abigail lang:en] Hello [voice:James lang:en] Hi` |\n\nEmotion markers (`[chuckle]`, `[laugh]`, …) work inside segment text and are passed through to synthesis.\n\n## Request parameters\n| Parameter | Required | Default | Notes |\n|-----------|----------|---------|-------|\n| `text` | yes | — | Full script with speaker tags on every segment. Max 50,000 characters per job. |\n| `voice` | yes | `Multi` | Must be `Multi` (case-insensitive). |\n| `language` | yes | `en` | Top-level language code (e.g. `en`, `de`). |\n| `quality` | no | `premium` | `basic`, `premium`, `ultra`. |\n| `output_format` | no | `mp3` | `mp3`, `wav`, `ogg`. |\n| `output` | no | `inline` | `inline` (default), `base64`, `url`. |\n| `priority` | no | plan default | Leave **unchecked** in Postman. |\n\n## Connection hold\n& polling (about 5 minute limit)\n\nIdentical to **Generate speech (single voice)**: default connection hold about 295s, then **HTTP 202** + `GET /job/get/{job_id}`.\n\n## Queue priority\n(optional)\n\nHigher priority = faster queue start. Does not change the hold timeout.\n\n## Related endpoints\n\n| Use case | Postman item |\n|----------|----------------|\n| One speaker | Generate speech (single voice) |\n| Custom voice from audio | Clone voice (TTS) |\n| Voice catalog | List available TTS voices |\n\n**Pipeline:** `paperoffice_voice___tts` (fixed, do not change the URL path)\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n*Documentation release: `R20260721.1103`* · status: `frozen`","body":{"mode":"formdata","formdata":[{"key":"text","type":"text","description":"**REQUIRED** | Script with speaker tags on every segment (max 50,000 characters). Examples: [en|Abigail] Hello [en|James] Hi. Default demo: support dialog with emotions. | Type: string","value":"[en|Abigail][happy] Welcome to PaperOffice Voice AI — thanks for calling support today. [en|James][breath] Hi, I am James. Your order SO-24091 shipped this morning. [en|Abigail][excited] We can narrate up to fifty thousand characters in one job — with speaker tags, emotions, and natural handoffs. [en|James][whisper] Try quality ultra when the message must sound executive-ready."},{"key":"voice","type":"text","description":"**REQUIRED** | Must be Multi for multi-speaker mode. | Type: string | Allowed: Multi","value":"Multi"},{"key":"language","type":"text","description":"**REQUIRED** | Top-level language code (required). Use the same codes as POST /voice/voices (e.g. en, de). | Type: string","value":"en"},{"key":"quality","type":"text","description":"Quality tier: basic, premium (default), ultra. | Type: string | Allowed: basic, premium, ultra","value":"premium"},{"key":"output_format","type":"text","description":"Audio format: mp3, wav, ogg. Default: mp3. | Type: string | Allowed: mp3, wav, ogg","value":"mp3"},{"key":"output","type":"text","description":"**REQUIRED** | Delivery mode: `inline` (binary HTTP body), `base64`, or `url`. When `output` is `inline` or `base64`, set `client_wait=true` (default) — otherwise HTTP 400 `CLIENT_WAIT_REQUIRED`. | Type: string","value":"inline"},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"Generate speech (single voice)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/job/add/paperoffice_voice___tts","host":["{{base_url}}"],"path":["job","add","paperoffice_voice___tts"]},"description":"## Overview\nConvert text to natural speech using a **single catalog voice** (PaperOffice neural TTS).\n\nUse this endpoint when you need one speaker, a fixed voice from the catalog, and audio in the same response (`output=inline`) or as JSON (`base64` / `url`).\n\n**Pipeline:** `paperoffice_voice___tts` (fixed URL path).\n\n## Prerequisites\n1. Call **`POST /voice/voices`** and pick a `name` from the language bucket you need.\n2. Default demo pair: **`Abigail`** with **`language=en`** (English, female).\n3. Each voice belongs to one catalog language (e.g. `Anneliese` → `de`). If `language` does not match, the API adjusts to the voice bucket and returns `warnings[]`.\n\n## Request parameters\n| Parameter | Required | Default | Notes |\n|-----------|----------|---------|-------|\n| `text` | yes | *(showroom demo)* | Up to 50,000 characters. Default script uses emotion markers and a reference ID (`SO-24091`). |\n| `voice` | yes | `Abigail` | Name from `POST /voice/voices` (same bucket as `language`). |\n| `language` | yes | `en` | Catalog bucket code (e.g. `en`, `de`). |\n| `quality` | no | `premium` | `basic` (fast), `premium` (balanced), `ultra` (best). |\n| `output_format` | no | `mp3` | `mp3`, `wav`, `ogg`. |\n| `output` | no | `inline` | `inline` = audio stream in HTTP body; `base64` / `url` = JSON. |\n| `priority` | no | plan default | Higher = faster queue start. Leave **unchecked** in Postman for your tier default. |\n\n**Text preparation (TTS):** When `language=de`, dates and common German business identifiers (order IDs, invoice refs) in `text` are normalized for natural speech. Other languages use standard number/date handling for the selected `language`.\n\n## Connection hold\n& polling (about 5 minute limit)\n\nThis is separate from **queue priority** (billing/speed only).\n\n- **Default (`client_wait` omitted or `true`):** The API holds **this HTTP connection** for up to **about 5 minutes (about 295 seconds)** — platform connection limit — and returns the finished result when ready.\n- **Hard timeout:** If the job is not done within that window → **HTTP 202** with `job_id` and `poll_url`. **Continue polling** `GET /job/get/{job_id}` every 5–10 seconds until `job_status` is `completed` or `failed`.\n- **Immediate poll mode:** `client_wait=false` or `async_only=true` → `job_id` in about 100ms, then poll as above.\n\nJob processing time can exceed 5 minutes; only the **HTTP wait** is capped.\n\n## Queue priority\n(optional)\n\n- **Omitted / unchecked in Postman** → your subscription **plan default** (from bearer token tier).\n- **Higher value (1–899)** → typically **faster queue start** on busy workers.\n- **`900`** → **synchronous / stream** processing (waits on this HTTP connection; not a queue tier above 899).\n- Does **not** change the about 5 minute connection hold or when HTTP 202 is returned.\n\nSee collection guide **Queue priority (billing & speed)** for tier tables (pricing is not duplicated in this request doc).\n\n## Long text (automatic segmentation)\n\nYou may send up to **50,000 characters** in one job. The API accepts the full text in one request — **do not** split the text yourself unless you want separate jobs.\n\n## Related endpoints (same pipeline URL, different body)\n\n| Use case | Postman item |\n|----------|----------------|\n| Clone voice from audio sample | Clone voice (TTS) — `voice_sample`, no catalog `voice` |\n| Multiple speakers in one text | Generate multi-speaker TTS — `voice=Multi` + inline tags |\n\n**Pipeline:** `paperoffice_voice___tts` (fixed, do not change the URL path)\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n*Documentation release: `R20260721.1103`* · status: `frozen`","body":{"mode":"formdata","formdata":[{"key":"text","type":"text","description":"**REQUIRED** | Text to convert to speech (max 50,000 characters). Inline emotion markers: [chuckle] [laugh] [sigh] [breath] [whisper] [happy] [excited]. Default demo showcases emotions and reference IDs (e.g. SO-24091). | Type: string","value":"[happy] Welcome to PaperOffice Voice AI — this is Abigail speaking. [breath] Your shipment reference SO-24091 is confirmed for delivery today. [excited] One request can synthesize up to fifty thousand characters with natural pacing, laughter, sighs, and whispers built in. [whisper] Set quality to ultra when every word must sound boardroom-ready — then press Send and listen."},{"key":"voice","type":"text","description":"**REQUIRED** | Voice name from POST /voice/voices — same language bucket as `language` (required). Default demo: Abigail (en, female). | Type: string","value":"Abigail"},{"key":"language","type":"text","description":"**REQUIRED** | Language code from the voice catalog bucket (required). Default: en for Abigail. List pairs via POST /voice/voices. | Type: string","value":"en"},{"key":"quality","type":"text","description":"Quality tier: basic (fast), premium (balanced), ultra (best). Default: premium. | Type: string | Allowed: basic, premium, ultra","value":"premium"},{"key":"output_format","type":"text","description":"Audio format: mp3 (compressed), wav (lossless), ogg. Default: mp3. | Type: string | Allowed: mp3, wav, ogg","value":"mp3"},{"key":"output","type":"text","description":"**REQUIRED** | Delivery mode: `inline` (binary HTTP body), `base64`, or `url`. When `output` is `inline` or `base64`, set `client_wait=true` (default) — otherwise HTTP 400 `CLIENT_WAIT_REQUIRED`. | Type: string","value":"inline"},{"key":"priority","type":"text","description":"*(optional)* | Queue priority (1–900): higher = faster queue start (1–899). 900 = synchronous/stream. Omit = plan default. | Type: integer","value":"","disabled":true}]}},"response":[]},{"name":"List available TTS voices","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/voice/voices","host":["{{base_url}}"],"path":["voice","voices"]},"description":"## Overview\nReturn the **PaperOffice TTS voice catalog**: all neural voices grouped by **language bucket**.\n\nUse this endpoint **before** any `POST /job/add/paperoffice_voice___tts` job to resolve valid `voice` + `language` pairs. This is a **direct REST call** (not a job) — the response is JSON immediately.\n\n**Endpoint:** `POST /voice/voices` (also supports `GET` with the same parameters).\n\n## Request parameters\n| Parameter | Required | Default | Notes |\n|-----------|----------|---------|-------|\n| `language` | no | *(all languages)* | Optional filter, e.g. `en`, `de`. Returns only that bucket when set. |\n\nSend as query string, form field, or JSON body — the API reads `language` from the request.\n\n## Using the catalog for TTS jobs\n\n1. Call **`POST /voice/voices`** (optionally filter `language=en`).\n2. Pick `name` from the returned bucket — it must match the `language` you pass to **`POST /job/add/paperoffice_voice___tts`**.\n3. Run **Generate speech (single voice)** with `voice` + `language` from the same bucket.\n\nIf `language` in the TTS job does not match the voice bucket, the API may adjust the bucket and return `warnings[]`.\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-tts-get-available-voices` (documentation ID; not a `/job/add/` pipeline slug)\n\n---\n*Documentation release: `R20260721.1103`* · status: `frozen`","body":{"mode":"formdata","formdata":[{"key":"language","type":"text","description":"Optional filter: return only this language bucket (e.g. en, de). Omit for the full catalog. | Type: string","value":"en"}]}},"response":[]}]},{"name":"🌐 Translation","description":"# Translation\n\nPaperOffice **Translation** provides a **unified text API** for strings, string arrays, and JSON objects across **35** supported languages.\n\n---\n\n## What you can do\n\n| Capability | Postman request | Endpoint |\n|------------|-----------------|----------|\n| **Language catalog** | `GET` Get supported languages | `/translate/languages` (API: 1 credit; app UI: free) |\n| **Translate content** | `POST` Translate text | `/translate/text` (JSON body, per-character tier billing) |\n\nThere are **only two public REST endpoints** — legacy names `batch` / `single` route to the same `text` command server-side.\n\n---\n\n## Translate text (unified)\n\n- **`text`:** string, string[], or JSON object (native JSON shapes, not escaped blobs).\n- **`target_language`:** required; codes from the catalog.\n- **`target_locale`:** optional regional variant (`de-DE`, `de-AT`, `de-CH`, `en-US`, …) from `GET /translate/languages` → `data.target_locale.variants` (prompt hint only; billing uses the 2-letter base).\n- **`source_language`:** optional (`auto` default).\n- **`tier`:** `basic`, `premium`, `ultra` (quality/speed).\n- **`tone` / `style`:** optional register and domain hints.\n- **`preserve_terms` / `preserve_terms_preset`:** keep brand or plan names verbatim.\n- **Max 15 000 characters** per request — split larger payloads client-side.\n\n**Delivery:** Hybrid **connection hold** (about 295 s) → inline translation or **HTTP 202** + `GET /job/get/{job_id}`. Optional **`priority` ≥ 900** for synchronous completion when capacity allows.\n\n---\n\n## Typical workflow\n\n1. **`GET /translate/languages`** — validate codes and cache `data.total` (= 35).\n2. **`POST /translate/text`** — send JSON with `text` + `target_language`.\n3. On **HTTP 202**, poll **`GET /job/get/{job_id}`** until `job_status` is `completed` or `failed`.\n\n---\n\n## Connection hold vs queue priority\n\n| Concept | Role |\n|---------|------|\n| **Connection hold** | Waits on this HTTP call up to **about 295 s**, then result or **202** + poll |\n| **Queue priority** | Optional **1–900**; **≥ 900** = synchronous translation attempt in the hold window |\n\n---\n\n## Best practices\n\n1. Use **Get supported languages** before building language pickers — do not hardcode lists.\n2. Use **Translate text** for all payload shapes — change `text` type in JSON, do not duplicate Postman requests.\n3. Send **`Content-Type: application/json`** — do not use form-data for `/translate/text`.\n4. Use `preserve_terms` for protected names (**PaperOffice**, plan tiers, integrations).\n5. Leave hidden fields (`client_wait`, `priority`) to API defaults or integration variables.\n\n---\n\n## Related modules\n\nOpen the parent folder **Media AI** for the **full section map** (all nine requests, JSON vs form-data, shared job model). Under **Media AI**: **Image Studio**, **Voice**. MCP may still expose legacy tool IDs (`po_translate_batch`, `po_translate_single`); the Postman collection exposes the **two masters** above.","item":[{"name":"Get supported languages","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/translate/languages","host":["{{base_url}}"],"path":["translate","languages"]},"description":"## Overview\nReturn the **PaperOffice Translation language catalog**: all **35** supported language codes with display names, flags, and tier metadata.\n\nUse this endpoint **before** `POST /translate/text` to validate `source_language` and `target_language`. This is a **direct REST call** (not a job) — the response is JSON immediately.\n\n**Endpoint:** `GET /translate/languages`\n\n**Billing:** **1 credit per API request** (external authenticated call). **Free in the PaperOffice app** (browser session / `credits_ui` subsidy — same pattern as the TTS voice catalog).\n\n## Request parameters\nNo parameters required. Optional filters may be added in future API versions — today the full catalog is always returned.\n\n## Regional variants (`data.target_locale`)\n\nOptional **locale variants** refine output (spelling, vocabulary, register) via LLM prompt hints only — **billing stays on the 2-letter `target_language`**.\n\n| Field | Description |\n|-------|-------------|\n| `data.target_locale.bases` | Language codes that offer variants (e.g. `de`, `en`, `es`, `fr`, `pt`, `nl`, `it`, `zh`, `ar`) |\n| `data.target_locale.variants` | Map: base code → list of `{ code, label, instruction }` — first entry is **Standard** (`code` = `\"\"`) |\n\n**Examples:** `de-DE`, `de-AT`, `de-CH` (German); `en-US`, `en-GB`, `en-AU`, `en-CA`; `es-ES`, `es-419`, `es-MX`; `fr-FR`, `fr-CA`, `fr-BE`, `fr-CH`; `pt-BR`, `pt-PT`; `nl-NL`, `nl-BE`; `it-IT`, `it-CH`; `zh-Hans`, `zh-Hant`; `ar-SA`, `ar-EG`, `ar-AE`, `ar-MA`.\n\nPass the chosen variant code as **`target_locale`** on **`POST /translate/text`** (must match `target_language` base).\n\n## Using the catalog for translation\n\n1. Call **`GET /translate/languages`** once per session or cache client-side.\n2. Pick valid ISO-style codes from `data.languages` for **`POST /translate/text`**.\n3. When needed, pick a regional variant from `data.target_locale.variants[target_language]` and send it as **`target_locale`**.\n4. Choose `tier` (`basic`, `premium`, `ultra`) — quality/speed trade-off; omit only when the plan default is intended.\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-translate-get-languages` (documentation ID; not a `/job/add/` pipeline slug)\n\n---\n*Documentation release: `R20260721.1103`* · status: `frozen`"},"response":[]},{"name":"Translate text","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/translate/text","host":["{{base_url}}"],"path":["translate","text"]},"description":"## Overview\nTranslate text with PaperOffice **Translation** — one endpoint for **string**, **string array**, and **JSON object** payloads.\n\nSupports **35** languages, optional **preserve_terms** for brand/product names, and **hybrid client-wait** (inline result, **HTTP 202** + poll, or immediate `job_id`).\n\n**Endpoint:** `POST /translate/text` with **`Content-Type: application/json`**.\n\n**Billing:** Per character volume and `tier` — see the account **Pricing Calculator** (not duplicated here).\n\n## Input types (`text` field)\n\n| `text` shape | Behavior | Response field |\n|--------------|----------|----------------|\n| **string** | Single passage | `translation` (string) |\n| **string[]** | Batch of strings (max 500 items) | `translations` (array) |\n| **object** | JSON structure (keys/values localized) | `translated_json` (object) |\n\nSend the shape as native JSON (not a stringified JSON blob inside a string).\n\n## Request parameters\n| Parameter | Required | Default | Notes |\n|-----------|----------|---------|-------|\n| `text` | **yes** | `Guten Morgen — PaperOffice Translation API showroom.` | string, string[], or JSON object |\n| `target_language` | **yes** | `en` | Target code from **Get supported languages** |\n| `target_locale` | no | — | Regional variant (e.g. `de-AT`, `en-GB`) from catalog `data.target_locale.variants`; prompt hint only |\n| `source_language` | no | `auto` | Source code or `auto` for detection |\n| `tier` | no | `premium` | `basic`, `premium`, or `ultra` |\n| `tone` | no | `neutral` | `formal`, `informal`, or `neutral` (register hint) |\n| `style` | no | `general` | `legal`, `medical`, `marketing`, or `general` (domain hint) |\n| `preserve_terms` | no | — | Up to 50 terms kept verbatim (brand/plan names) |\n| `preserve_terms_preset` | no | — | Opt-in server preset, e.g. `paperoffice_brand` |\n| `client_wait` | no | `true` | Connection hold (about 295s); optional JSON body field (omitted from Postman form) |\n| `async_only` | no | `false` | Force immediate `job_id`; optional JSON body field (omitted from Postman form) |\n| `priority` | no | plan default | 1–900; **≥900** sync path; optional JSON body field (omitted from Postman form) |\n\n## Connection hold\n& polling (about 5 minute limit)\n\n- **Default:** This HTTP request is held up to **about 5 minutes (about 295 s)**; then **200** with translation or **202** + `poll_url`.\n- **Poll:** `GET /job/get/{job_id}` every 5–10 s after **202** until `job_status` is `completed` or `failed`.\n- **Immediate job id:** Send `client_wait=false` or `async_only=true` in the JSON request body to receive `job_id` immediately, then poll **`GET /job/get/{job_id}`**.\n\n## Queue priority\n(optional)\n\n- **Omitted** → subscription plan default from bearer tier.\n- **`900`** → synchronous translation attempt within the hold window when capacity allows.\n- Valid range: **1–900** (values above 900 are capped server-side).\n\n## Related endpoint\n\n| Use case | Postman item |\n|----------|----------------|\n| List valid language codes (35) | Get supported languages |\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-translate-text` (documentation ID; not a `/job/add/` pipeline slug)\n\n---\n*Documentation release: `R20260721.1103`* · status: `frozen`","body":{"mode":"raw","raw":"{\n    \"text\": \"Guten Morgen — PaperOffice Translation API showroom.\",\n    \"source_language\": \"de\",\n    \"target_language\": \"en\",\n    \"tier\": \"premium\"\n}","options":{"raw":{"language":"json"}}}},"response":[]}]}]},{"name":"🔗 Relations AI","description":"# Relations AI\n\n**Relations AI** connects documents, accounts, and commercial relationships: **CRM intelligence** (accounts, contacts, opportunities) plus graph-style links between partners and document activity.\n\n---\n\n## Sub-modules\n\n| Sub-module | Folder | Primary use |\n|------------|--------|-------------|\n| **CRM & Relations** | CRM & Relations | Accounts, contacts, CRM-scoped analytics and document links |\n\n---\n\n## Typical workflows\n\n1. **360° account view** — list CRM accounts, then pull related documents and knowledge-graph partners.\n2. **Sales ops** — sync opportunity metadata into your data warehouse via scheduled API pulls.\n3. **Support** — jump from a helpdesk ticket to CRM account endpoints before opening documents in **Document AI**.\n\n---\n\n## Prerequisites\n\n- Bearer token with **Relations AI** / CRM module access\n- CRM entity IDs from list/get endpoints (not document `pofid` unless filtering documents)\n\nCross-link **Analytics AI** for BI over the same workspace estate.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.\n---\n\n**Integration tips:** Open the **Docs** tab on each request for parameters, auth mode, and response examples. For async pipelines, poll `GET /job/get/{job_id}` after **HTTP 202**. See **Introduction & Basics → Guides** for connection hold, queue priority, and error codes. Credit amounts live under **`GET /job/pricelist`** or in `_billing` on responses — not repeated in every folder overview.\n---\n\n**Integration tips:** Open the **Docs** tab on each request for parameters, auth mode, and response examples. For async pipelines, poll `GET /job/get/{job_id}` after **HTTP 202**. See **Introduction & Basics → Guides** for connection hold, queue priority, and error codes. Credit amounts live under **`GET /job/pricelist`** or in `_billing` on responses — not repeated in every folder overview.\n---\n\n**Integration tips:** Open the **Docs** tab on each request for parameters, auth mode, and response examples. For async pipelines, poll `GET /job/get/{job_id}` after **HTTP 202**. See **Introduction & Basics → Guides** for connection hold, queue priority, and error codes. Credit amounts live under **`GET /job/pricelist`** or in `_billing` on responses — not repeated in every folder overview.","item":[{"name":"🤝 CRM & Relations","description":"# CRM & Relations\n\n**Customer relationship endpoints** for accounts, contacts, and CRM-scoped AI document operations — canonical paths under `/crm_intelligence/*` and related Relations APIs in this collection.\n\n---\n\n## Usage\n\n- Start with **list** endpoints to obtain `crm_account_id` and contact identifiers\n- Pass explicit `workspace_id` when using sub-user tokens\n- Use partner and publisher IDs from list responses — do not guess numeric IDs\n\n---\n\n## Integration checklist\n\n| Step | Action |\n|------|--------|\n| 1 | Resolve `crm_account_id` via list/search endpoints |\n| 2 | Fetch account detail and linked documents |\n| 3 | Correlate with **Knowledge Graph** partners where applicable |\n\nRetry safe GETs on transient errors; avoid duplicate POST creates without idempotency keys.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.","item":[{"name":"Get linked documents","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/crm_intelligence/document_links/{{crm_account_id}}","host":["{{base_url}}"],"path":["crm_intelligence","document_links","{{crm_account_id}}"],"query":[{"key":"limit","value":"","description":"Max results (default: 50, max: 200) | Type: string","disabled":true}],"variable":[{"key":"crm_account_id","value":"","description":"Path parameter `crm_account_id` — see the parameter table in the endpoint description."}]},"description":"## Overview\nDocuments linked to a CRM account. Link Types: - invoice - Invoices - contract - Contracts - quote - Quotes - correspondence - Correspondence - related - Other\n\n## Request parameters\n## Best practices\n- Use account, workspace, or CRM entity identifiers from list/get endpoints — not document `pofid` unless filtering documents.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-documents-get-linked-documents` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Get account insights","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/crm_intelligence/insights/{{crm_account_id}}","host":["{{base_url}}"],"path":["crm_intelligence","insights","{{crm_account_id}}"],"query":[{"key":"account_id","value":"","description":"Optional CRM account ID for targeted insights. | Type: integer","disabled":true},{"key":"type","value":"","description":"Filter after Insight-type (e.g. 'churn_risk', 'sentiment'). | Type: string","disabled":true},{"key":"min_score","value":"","description":"Minimum score value for filtering. | Type: number","disabled":true},{"key":"max_score","value":"","description":"Maximum score threshold for filtering results. | Type: number","disabled":true},{"key":"limit","value":"","description":"Maximum number results. | Type: integer | Max: 200","disabled":true},{"key":"offset","value":"","description":"Offset for pagination. | Type: integer","disabled":true}],"variable":[{"key":"crm_account_id","value":"","description":"Path parameter `crm_account_id` — see the parameter table in the endpoint description."}]},"description":"## Overview\nAll AI insights for a specific CRM account. Including Overall Health Score and Risk Level.\n\n## Request parameters\n## Best practices\n- Use account, workspace, or CRM entity identifiers from list/get endpoints — not document `pofid` unless filtering documents.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-insights-get-account-insights` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Get all insights","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/crm_intelligence/insights","host":["{{base_url}}"],"path":["crm_intelligence","insights"],"query":[{"key":"account_id","value":"","description":"Optional: Filter by CRM account | Type: string","disabled":true},{"key":"type","value":"","description":"Optional: sentiment, health_score, churn_risk, engagement, upsell_potential | Type: string","disabled":true},{"key":"min_score","value":"","description":"Optional: Minimum score | Type: string","disabled":true},{"key":"max_score","value":"","description":"Optional: Maximum score | Type: string","disabled":true},{"key":"limit","value":"","description":"Max results (default: 50, max: 200) | Type: string","disabled":true}]},"description":"## Overview\nAll AI Insights across accounts or filtered. Insight Types: - sentiment - communication_sentiment - health_score - relationship_health - churn_risk - attrition_risk - engagement - engagement_level - upsell_potential - upselling_potential - support_satisfaction - support_satisfaction\n\n## Request parameters\n## Best practices\n- Use account, workspace, or CRM entity identifiers from list/get endpoints — not document `pofid` unless filtering documents.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-insights-get-all-insights` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Get upsell opportunities","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/crm_intelligence/opportunities","host":["{{base_url}}"],"path":["crm_intelligence","opportunities"],"query":[{"key":"min_potential","value":"","description":"Minimum upsell potential (default: 0.3) | Type: string","disabled":true},{"key":"limit","value":"","description":"Max results (default: 20, max: 100) | Type: string","disabled":true}]},"description":"## Overview\nIdentify upselling opportunities. Accounts with high upselling potential, sorted by score.\n\n## Request parameters\n## Best practices\n- Use account, workspace, or CRM entity identifiers from list/get endpoints — not document `pofid` unless filtering documents.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-opportunities-get-upsell-opportunities` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Get at-risk accounts","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/crm_intelligence/at_risk","host":["{{base_url}}"],"path":["crm_intelligence","at_risk"],"query":[{"key":"threshold","value":"","description":"Churn risk threshold (default: 0.5) | Type: string","disabled":true},{"key":"limit","value":"","description":"Max results (default: 20, max: 100) | Type: string","disabled":true}]},"description":"## Overview\nAccounts with high churn risk. Sorted by risk score, including factors and recommendations.\n\n## Request parameters\n## Best practices\n- Use account, workspace, or CRM entity identifiers from list/get endpoints — not document `pofid` unless filtering documents.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-risk-analysis-get-atrisk-accounts` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Get sentiment history","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/crm_intelligence/sentiment/{{crm_account_id}}","host":["{{base_url}}"],"path":["crm_intelligence","sentiment","{{crm_account_id}}"],"query":[{"key":"days","value":"","description":"History period in days (default: 90, max: 365) | Type: string","disabled":true}],"variable":[{"key":"crm_account_id","value":"","description":"Path parameter `crm_account_id` — see the parameter table in the endpoint description."}]},"description":"## Overview\nSentiment analysis for an account over time. Shows sentiment trend from emails and notes.\n\n## Request parameters\n## Best practices\n- Use account, workspace, or CRM entity identifiers from list/get endpoints — not document `pofid` unless filtering documents.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-sentiment-get-sentiment-history` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]},{"name":"Get CRM statistics","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/crm_intelligence/stats","host":["{{base_url}}"],"path":["crm_intelligence","stats"]},"description":"## Overview\nGlobal CRM Intelligence Statistics. Overview of all accounts, insights, risks, and opportunities.\n\n## Request parameters\n## Best practices\n- Use account, workspace, or CRM entity identifiers from list/get endpoints — not document `pofid` unless filtering documents.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-statistics-get-crm-stats` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)"},"response":[]}]}]},{"name":"🛡️ Security AI","description":"# Security AI\n\n**Security AI** groups fraud and abuse signals: **Fingerprint SDK** device intelligence and **Fake Email Detector** disposable-domain checks.\n\n---\n\n## Sub-modules\n\n| Sub-module | Folder |\n|------------|--------|\n| **Fingerprint SDK** | Fingerprint SDK |\n| **Fake Email Detector** | Fake Email Detector |\n| **Privacy & Compliance** | Privacy & Compliance |\n\nCombine with **Data AI → IP Geolocation** for layered signup protection.\n\n---\n\n## Privacy\n\nFingerprinting must be disclosed to end users per applicable law. Store only necessary signals server-side.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.\n---\n\n**Integration tips:** Open the **Docs** tab on each request for parameters, auth mode, and response examples. For async pipelines, poll `GET /job/get/{job_id}` after **HTTP 202**. See **Introduction & Basics → Guides** for connection hold, queue priority, and error codes. Credit amounts live under **`GET /job/pricelist`** or in `_billing` on responses — not repeated in every folder overview.\n---\n\n**Integration tips:** Open the **Docs** tab on each request for parameters, auth mode, and response examples. For async pipelines, poll `GET /job/get/{job_id}` after **HTTP 202**. See **Introduction & Basics → Guides** for connection hold, queue priority, and error codes. Credit amounts live under **`GET /job/pricelist`** or in `_billing` on responses — not repeated in every folder overview.\n---\n\n**Integration tips:** Open the **Docs** tab on each request for parameters, auth mode, and response examples. For async pipelines, poll `GET /job/get/{job_id}` after **HTTP 202**. See **Introduction & Basics → Guides** for connection hold, queue priority, and error codes. Credit amounts live under **`GET /job/pricelist`** or in `_billing` on responses — not repeated in every folder overview.\n---\n\n**Integration tips:** Open the **Docs** tab on each request for parameters, auth mode, and response examples. For async pipelines, poll `GET /job/get/{job_id}` after **HTTP 202**. See **Introduction & Basics → Guides** for connection hold, queue priority, and error codes. Credit amounts live under **`GET /job/pricelist`** or in `_billing` on responses — not repeated in every folder overview.","item":[{"name":"🔐 Fingerprint SDK","description":"# Fingerprint SDK\n\nDevice **fingerprinting** and trust scoring for fraud prevention: collect browser signals, submit events, and query risk levels.\n\n---\n\n## Integration\n\n1. Load client SDK snippet from PaperOffice docs (app configuration)\n2. Send events to API endpoints listed here\n3. Act on risk score in registration or payment flows\n\nServer-side Bearer token required for administrative queries.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Find similar devices (fingerprint)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/fingerprint/similar","host":["{{base_url}}"],"path":["fingerprint","similar"]},"description":"## Overview\nFind devices with similar fingerprint signals in your tenant. Returns ranked matches with similarity scores for fraud and duplicate-account analysis.\n\nOptional `network_pool` requires a PaperOffice-approved add-on — default is tenant-isolated data only.\n\n## Request parameters\n## Best practices\n- Use stable `identifier_hash` or `visitor_id` values from your own first-party context.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-fingerprint-find-similar-devices-v2` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"id","type":"text","description":"**REQUIRED** | Visitor-Reference device ID (32-character SHA-256 hash) | Type: string","value":"id_value"},{"key":"threshold","type":"text","description":"Minimum similarity threshold for filtering results (0.0–1.0). | Type: number | Max: 1","value":"","disabled":true},{"key":"network_pool","type":"text","description":" Network Intelligence pool (requires PaperOffice-approved add-on; default false = tenant-isolated) | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Get fingerprint device details","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/fingerprint/device","host":["{{base_url}}"],"path":["fingerprint","device"]},"description":"## Overview\nLoad detailed device attributes for a known fingerprint hash — platform, browser family, first/last seen timestamps, and linked session metadata (tenant-scoped).\n\nSee the parameter table below for `fingerprint_hash` or `visitor_id`.\n\n## Request parameters\n#### Required alternatives\n\nProvide **at least one** of: `id` **or** `visitorId` **or** `visitor_id`.\n\n## Best practices\n- Use stable `identifier_hash` or `visitor_id` values from your own first-party context.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-fingerprint-get-device-details` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"id","type":"text","description":"**ONE OF REQUIRED** | Visitor device ID (32 characters). Aliases: visitor_id, visitorId | Type: string","value":"id_value"},{"key":"visitor_id","type":"text","description":"**ONE OF REQUIRED** | Alias for id (snake_case variant) | Type: string","value":"","disabled":true},{"key":"visitorId","type":"text","description":"**ONE OF REQUIRED** | camelCase alias for id (visitorId) for SDK compatibility | Type: string","value":"","disabled":true}]}},"response":[]},{"name":"Get linked devices (fingerprint)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/fingerprint/linked","host":["{{base_url}}"],"path":["fingerprint","linked"]},"description":"## Overview\nList devices linked through shared network and behavioral signals (IP clustering, visitor graph) within your tenant.\n\nOptional `network_pool` requires a PaperOffice-approved add-on — default is tenant-isolated data only.\n\n## Request parameters\n## Best practices\n- Use stable `identifier_hash` or `visitor_id` values from your own first-party context.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-fingerprint-get-linked-devices-v2` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"id","type":"text","description":"**REQUIRED** | Visitor-ID for network connection lookup (32 characters) | Type: string","value":"id_value"},{"key":"network_pool","type":"text","description":" Network Intelligence pool (requires PaperOffice-approved add-on; default false = tenant-isolated) | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Identify device (fingerprint)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/fingerprint/identify","host":["{{base_url}}"],"path":["fingerprint","identify"]},"description":"Identify a browser or app visitor from first-party signals (fingerprint hash). Returns a stable device profile for fraud prevention and session correlation within your tenant.\n\nUse the **Params** tab for `visitor_id`, optional `network_pool` (approved add-on only), and filters. See **Introduction → Guides** for authentication.\n\nFor GDPR erasure of stored identifiers, use **Privacy Forget (Art. 17)** in this collection.\n\n---\n**API reference:** `po-fingerprint-identify-device-v2` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"components","type":"text","description":"Client-side fingerprint components from the JavaScript SDK (Canvas, WebGL, Audio, Fonts, Behavioral) | Type: object","value":"","disabled":true},{"key":"include","type":"text","description":"Comma-separated Enrichment Modules (e.g., anonywithy, currency) or core for minimal Response | Type: string","value":"","disabled":true},{"key":"language","type":"text","description":"Language code for enriched data (ISO 639-1) | Type: string","value":"","disabled":true},{"key":"visitorId","type":"text","description":"Visitor-ID pre-calculated by the client | Type: string","value":"","disabled":true},{"key":"confidence","type":"text","description":"Client-seitig berechneter Konfidenz-Score (0-100) | Type: number","value":"","disabled":true},{"key":"botDetection","type":"text","description":"Client-seitige Bot-detectionsdaten with signals-Array | Type: object","value":"","disabled":true},{"key":"network_pool","type":"text","description":" Network Intelligence pool (requires PaperOffice-approved add-on; default false = tenant-isolated) | Type: boolean","value":"","disabled":true}]}},"response":[]},{"name":"Verify fingerprint","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/fingerprint/verify","host":["{{base_url}}"],"path":["fingerprint","verify"]},"description":"## Overview\nVerify whether a submitted fingerprint hash matches a known device profile in your tenant. Useful for step-up checks and login risk scoring.\n\nSee the parameter table below for required fields. For identifier erasure, use **Privacy Forget (Art. 17)**.\n\n## Request parameters\n## Best practices\n- Use stable `identifier_hash` or `visitor_id` values from your own first-party context.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-fingerprint-verify-fingerprint` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"visitorId","type":"text","description":"Expected visitor ID to verify against | Type: string","value":"","disabled":true}]}},"response":[]}]},{"name":"📧 Fake Email Detector","description":"# Fake Email Detector\n\nDetect **disposable**, temporary, and high-risk email domains before account creation or outbound campaigns.\n\n---\n\n## Usage\n\n- Validate at form submit (synchronous JSON)\n- Cache negative results with TTL in your app\n- Pair with double opt-in for marketing lists\n\nDoes not replace full SMTP deliverability testing.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.\n---\n\n## How to read this folder\n\n| Step | Action |\n|------|--------|\n| 1 | Pick the request that matches your integration step |\n| 2 | Read the **Docs** tab (auth, body mode, examples) |\n| 3 | Send with Bearer token; inspect `_billing` when present |\n| 4 | For jobs: poll `GET /job/get/{job_id}` after **HTTP 202** |\n\n**Guides:** **Introduction & Basics → Guides → Priority, Jobs & Connection Hold** · **Workflow AI → Workflow Orchestration** (multi-step) · **Introduction → Reference** (errors).\n\n**Pricing:** **`GET /job/pricelist`** and the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator) — no fixed credit amounts in folder overviews.","item":[{"name":"Check email","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/fakeemail/check","host":["{{base_url}}"],"path":["fakeemail","check"]},"description":"## Overview\nCheck whether an email address is disposable or fake.\n\n**Example emails:** `user@example.com` is a generic placeholder; `test@tempmail.com` is an **intentional disposable-domain** example for fake-email detection demos.\n\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-email-detector-check-email` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"email","type":"text","description":"**REQUIRED** | Email address to check for disposable/fake patterns. | Type: string | Example: test@tempmail.com","value":"test@tempmail.com"}]}},"response":[]},{"name":"Check emails","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/fakeemail/check_bulk","host":["{{base_url}}"],"path":["fakeemail","check_bulk"]},"description":"## Overview\nValidate a batch of email addresses for deliverability and disposable-domain signals.\n\n## Request parameters\n## Best practices\n- No document `pofid` is required — use the query/body fields in the parameter table.\n- **Authenticated API access required** — not available on VISITOR auto-tier without `po_sk_` / `po_ut_` / `po_pk_`.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-email-detector-bulk-check-emails` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 10 credits (base, at `priority=500`)","body":{"mode":"raw","raw":"{\n    \"emails\": [\n        \"user@example.com\",\n        \"test@tempmail.com\"\n    ]\n}","options":{"raw":{"language":"json"}}}},"response":[]}]},{"name":"🛡️ Privacy & Compliance","description":"# Privacy & Compliance\n\n**GDPR-oriented privacy tools** for fingerprint data: lookup retention metadata, export subject data, and execute **right-to-erasure** (forget) flows where legally permitted.\n\n---\n\n## Typical workflows\n\n1. **Subject access request** — export stored fingerprint signals linked to a visitor identifier.\n2. **Erasure** — call forget endpoints with a validated identifier hash after internal approval.\n3. **Audit** — correlate with **Fingerprint SDK** event logs in your security tooling.\n\n---\n\n## Prerequisites\n\n- Bearer token with privacy/compliance permissions on the tenant\n- Stable first-party `identifier_hash` or `visitor_id` from your application context\n- Documented legal basis for processing in your privacy policy\n\nPair with **Security AI → Fingerprint SDK** for collection; use this folder for regulatory operations.\n---\n\n## Authentication & billing\n\nAll endpoints require a **Bearer token** unless noted as visitor-test in **Introduction & Basics**.\n\nInspect `_billing` on JSON responses for credit usage. Plan tiers: **`GET /job/pricelist`** or the [Pricing Calculator](https://app.paperoffice.ai/en/pricing/calculator).\n\n## MCP Server\n\nMost endpoints in this folder are also callable via **Model Context Protocol (MCP)** — **DMS (canonical):** `https://mcp.paperoffice.ai/dms`, **Claude:** `https://mcp.paperoffice.ai/claude` (alias), **Cursor:** `https://mcp.paperoffice.ai/cursor`, **ChatGPT:** `https://mcp.paperoffice.ai/openai` — using the same Bearer token. Tool IDs match the Postman `tool_id` field — see **Introduction & Basics → Integration & Discovery**.","item":[{"name":"Privacy Forget (Art. 17)","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/privacy/forget","host":["{{base_url}}"],"path":["privacy","forget"]},"description":"## Overview\nDelete fingerprint records for an identifier within the authenticated tenant (Art. 17 GDPR erasure). Sets a tombstone to block re-ingestion of the same identifier.\n\nProvide `identifier_hash` and/or `visitor_id` in the **Body** tab. Processing is limited to your tenant scope.\n\n## Request parameters\n## Best practices\n- Use stable `identifier_hash` or `visitor_id` values from your own first-party context.\n- Retry safe GET requests on transient errors; avoid duplicate POST submits without idempotency keys.\n\n---\n**API reference:** `po-privacy-forget-fingerprint` (documentation ID; not a `/job/add/` pipeline slug) • **Cost:** 1 credit (base, at `priority=500`)","body":{"mode":"formdata","formdata":[{"key":"identifier_hash","type":"text","description":"SHA-256 hash of visitor_id or component hash | Type: string","value":"","disabled":true},{"key":"visitor_id","type":"text","description":"Optional visitor_id to delete directly | Type: string","value":"","disabled":true}]}},"response":[]}]}]}]}