@talonic/docs 0.20.0 → 0.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/seo.js CHANGED
@@ -4,7 +4,7 @@ var openapi_default = {
4
4
  info: {
5
5
  title: "Talonic API",
6
6
  version: "1.0.0",
7
- description: 'Structure any document into schema-validated data.\n\nThe Talonic API lets you extract structured data from documents (PDFs, images,\nDOCX, CSV, plain text), manage reusable extraction schemas, track async jobs,\nand organise documents through sources.\n\n## Quick Start\n\n**1. Get your API key**\n\nSign up at [app.talonic.com](https://app.talonic.com) \u2192 Settings \u2192 API Keys \u2192 Create key.\nKeys start with `tlnc_live_` (production) or `tlnc_test_` (sandbox).\nAll examples below use `tlnc_live_abc123` as a placeholder.\n\n**2. Extract your first document**\n\n```bash\ncurl -X POST https://api.talonic.com/v1/extract \\\n -H "Authorization: Bearer tlnc_live_abc123" \\\n -F "file=@invoice.pdf" \\\n -F \'schema={"properties":{"vendor_name":{"type":"string"},"total_amount":{"type":"number"},"invoice_date":{"type":"string"}}}\'\n```\n\n**Python:**\n```python\nimport requests\nresp = requests.post("https://api.talonic.com/v1/extract",\n headers={"Authorization": "Bearer tlnc_live_abc123"},\n files={"file": open("invoice.pdf", "rb")},\n data={"schema": \'{"properties":{"vendor_name":{"type":"string"},"total_amount":{"type":"number"},"invoice_date":{"type":"string"}}}\'})\nprint(resp.json()["data"])\n```\n\n**TypeScript:**\n```typescript\nconst form = new FormData();\nform.append("file", fs.createReadStream("invoice.pdf"));\nform.append("schema", \'{"properties":{"vendor_name":{"type":"string"},"total_amount":{"type":"number"},"invoice_date":{"type":"string"}}}\');\nconst res = await fetch("https://api.talonic.com/v1/extract", {\n method: "POST",\n headers: { Authorization: "Bearer tlnc_live_abc123" },\n body: form,\n}).then(r => r.json());\nconsole.log(res.data);\n```\n\n**3. What you get back**\n\n```json\n{\n "extraction_id": "d1a2b3c4-5678-9abc-def0-1234567890ab",\n "request_id": "req_x7y8z9a0b1c2d3e4",\n "status": "complete",\n "document": {\n "id": "f0e1d2c3-b4a5-9687-8765-432109876543",\n "filename": "invoice.pdf",\n "pages": 2,\n "size_bytes": 184320,\n "type_detected": "Invoice",\n "language_detected": "en"\n },\n "data": {\n "vendor_name": "Acme GmbH",\n "total_amount": 14250.00,\n "invoice_date": "2025-03-15"\n },\n "confidence": {\n "overall": 0.96,\n "fields": {\n "vendor_name": 0.97,\n "total_amount": 0.94,\n "invoice_date": 0.99\n }\n },\n "processing": {\n "duration_ms": 1840,\n "pages_processed": 2,\n "region": "eu-west"\n },\n "links": {\n "self": "/v1/extractions/d1a2b3c4-5678-9abc-def0-1234567890ab",\n "document": "/v1/documents/f0e1d2c3-b4a5-9687-8765-432109876543"\n }\n}\n```\n\n- **`data`** \u2014 extracted fields as key-value pairs matching your schema.\n- **`confidence.fields`** \u2014 per-field score from 0 to 1. Above 0.9 is high confidence; below 0.7 flags for review.\n- **`extraction_id`** \u2014 use this to retrieve, correct, or deliver results later.\n- Full response schema: [ExtractSyncResponse](#/components/schemas/ExtractSyncResponse)\n\n**4. Next steps**\n\n- **50+ pages?** Use async mode \u2014 see [Async Extraction Flow](#section/Async-Extraction-Flow) below.\n- **Reusable schemas** \u2014 save field definitions with `POST /v1/schemas`, then pass `schema_id` on future extractions.\n- **Receive results via webhook** \u2014 configure a delivery destination and listen for `document.extracted` events. See the [Delivery](#tag/Delivery) tag.\n\n---\n\n## Authentication\n\nAll requests require a Bearer token in the `Authorization` header.\nAPI keys are prefixed with `tlnc_` and scoped per customer.\n\n```\nAuthorization: Bearer tlnc_live_abc123...\n```\n\n## Async Extraction Pattern\n\nSmall documents (\u22645 pages) are processed synchronously and return a `200`\nwith the extracted data immediately. Larger documents return a `202 Accepted`\nwith a `poll_url` \u2014 poll `GET /v1/documents/{id}` until `status` transitions\nto `completed`, then fetch results via `GET /v1/documents/{id}/extractions`.\n\nYou can force async processing by passing `options: {"async": true}` on\nany extraction request. Combine with webhooks for a fully event-driven flow:\nconfigure a webhook destination under Delivery and listen for the\n`extraction.complete` event.\n\n**Job status lifecycle:** `pending` \u2192 `processing` \u2192 `complete` | `failed`\n\n## Rate Limits\n\nRequests are metered per calendar day (UTC). Limits depend on your plan tier:\n\n| Tier | Extract | Platform | Ingest |\n|------------|---------|----------|--------|\n| Free | 50/day | 500/day | 50/day |\n| Pro | 2,000 | 10,000 | 2,000 |\n| Enterprise | Unlimited | Unlimited | Unlimited |\n\nEvery response includes rate-limit headers:\n- `X-RateLimit-Limit` \u2014 daily cap for the namespace\n- `X-RateLimit-Remaining` \u2014 requests left today\n- `X-RateLimit-Reset` \u2014 ISO 8601 timestamp when the window resets (midnight UTC)\n\n## Pagination\n\nList endpoints use cursor-based pagination. Pass `limit` (1\u2013100, default 20),\n`cursor` (opaque token from `pagination.next_cursor`), and `order` (`asc` or `desc`, default `desc`).\n\n## Errors\n\nAll errors return a JSON body with `error` (machine-readable code) and `message`\n(human-readable explanation). Additional fields vary by error type.\n\n| Code | Error | Description |\n|------|--------------------|------------------------------------------|\n| 400 | validation_error | Request body is malformed or invalid |\n| 401 | unauthorized | Missing or invalid API key |\n| 403 | insufficient_scope | API key lacks the required scope |\n| 404 | not_found | Resource does not exist |\n| 409 | conflict | Resource state conflict |\n| 413 | payload_too_large | File exceeds 500 MB limit |\n| 422 | extraction_failed | Document could not be processed |\n| 429 | rate_limit_exceeded| Daily rate limit reached |\n| 500 | internal_error | Unexpected server error (retryable) |\n\nEvery error response follows this envelope:\n\n```json\n{\n "statusCode": 400,\n "code": "VALIDATION_ERROR",\n "error": "Bad Request",\n "message": "name is required.",\n "retryable": false,\n "timestamp": "2026-04-25T14:30:00.000Z",\n "path": "/v1/schemas"\n}\n```\n\nThe `code` field is one of: `VALIDATION_ERROR`, `AUTH_REQUIRED`, `TOKEN_EXPIRED`,\n`INSUFFICIENT_PERMISSIONS`, `RESOURCE_NOT_FOUND`, `QUOTA_EXCEEDED`,\n`INSUFFICIENT_CREDITS`, `LLM_RATE_LIMITED`, `LLM_TIMEOUT`, `LLM_UNAVAILABLE`,\n`OCR_FAILED`, `EXTRACTION_FAILED`, `EXTRACTION_TIMEOUT`, `FILE_TOO_LARGE`,\n`DUPLICATE_RESOURCE`, `DATASPACE_RUN_FAILED`, `INTERNAL_ERROR`.\n\n## Async Extraction Flow\n\nDocuments \u22645 pages return results synchronously (`200`). Larger documents\n\u2014 or any request with `options: {"async": true}` \u2014 return `202 Accepted`.\n\n**1. Submit extraction:**\n\n```bash\ncurl -X POST https://api.talonic.com/v1/extract \\\n -H "Authorization: Bearer tlnc_live_abc123" \\\n -F "file=@contract.pdf" \\\n -F \'options={"async": true}\'\n```\n\nResponse `202`:\n```json\n{\n "request_id": "req_x7y8z9a0",\n "status": "processing",\n "document": { "id": "f0e1d2c3-b4a5-9687-8765-432109876543" },\n "poll_url": "/v1/documents/f0e1d2c3-b4a5-9687-8765-432109876543"\n}\n```\n\n**2. Poll until complete:**\n\n```bash\ncurl https://api.talonic.com/v1/documents/f0e1d2c3-b4a5-9687-8765-432109876543 \\\n -H "Authorization: Bearer tlnc_live_abc123"\n```\n\nWhile processing: `{ "status": "processing" }`\nWhen done: `{ "status": "completed" }`\n\n**3. Retrieve results:**\n\n```bash\ncurl https://api.talonic.com/v1/documents/f0e1d2c3-b4a5-9687-8765-432109876543/extractions \\\n -H "Authorization: Bearer tlnc_live_abc123"\n```\n\n**Python \u2014 complete async flow with exponential backoff:**\n\n```python\nimport time\nimport requests\n\nAPI_KEY = "tlnc_live_..."\nBASE = "https://api.talonic.com/v1"\nHEADERS = {"Authorization": f"Bearer {API_KEY}"}\n\n# Step 1: Submit async extraction\nresp = requests.post(f"{BASE}/extract",\n headers=HEADERS,\n files={"file": open("contract.pdf", "rb")},\n data={"options": \'{"async": true}\'})\ndoc_id = resp.json()["document"]["id"]\n\n# Step 2: Poll with exponential backoff (2s \u2192 4s \u2192 8s \u2192 16s \u2192 30s cap)\ndelay = 2\nfor _ in range(20):\n time.sleep(delay)\n doc = requests.get(f"{BASE}/documents/{doc_id}", headers=HEADERS).json()\n if doc["status"] == "completed":\n break\n if doc["status"] == "error":\n raise Exception(f"Extraction failed: {doc.get(\'error\')}")\n delay = min(delay * 2, 30)\n\n# Step 3: Retrieve extracted data\nextractions = requests.get(\n f"{BASE}/documents/{doc_id}/extractions", headers=HEADERS).json()\ndata = extractions["data"][0]["data"]\nconfidence = extractions["data"][0]["confidence"]["overall"]\nprint(f"Extracted {len(data)} fields (confidence: {confidence})")\nprint(data)\n# \u2192 {"vendor_name": "Acme Corp", "total_amount": 1250.00, ...}\n```\n\n**TypeScript \u2014 same flow:**\n\n```typescript\nconst API_KEY = "tlnc_live_...";\nconst BASE = "https://api.talonic.com/v1";\nconst headers = { Authorization: `Bearer ${API_KEY}` };\n\n// Step 1: Submit async extraction\nconst form = new FormData();\nform.append("file", fs.createReadStream("contract.pdf"));\nform.append("options", \'{"async": true}\');\nconst { document } = await fetch(`${BASE}/extract`, {\n method: "POST", headers, body: form,\n}).then((r) => r.json());\n\n// Step 2: Poll with exponential backoff\nlet delay = 2000;\nlet doc: any;\nfor (let i = 0; i < 20; i++) {\n await new Promise((r) => setTimeout(r, delay));\n doc = await fetch(`${BASE}/documents/${document.id}`, { headers }).then((r) => r.json());\n if (doc.status === "completed") break;\n if (doc.status === "error") throw new Error(`Extraction failed: ${doc.error}`);\n delay = Math.min(delay * 2, 30_000);\n}\n\n// Step 3: Retrieve extracted data\nconst { data: extractions } = await fetch(\n `${BASE}/documents/${document.id}/extractions`, { headers }\n).then((r) => r.json());\nconsole.log(extractions[0].data);\n// \u2192 { vendor_name: "Acme Corp", total_amount: 1250.00, ... }\n```\n\nRecommended polling: 2s initial, exponential backoff (2\u21924\u21928\u219216\u219230s cap),\ntimeout after 5 minutes.\n\n**Alternative \u2014 Webhooks:** Configure a delivery destination and listen for\n`document.extracted` events. See the Delivery tag.\n\n**Job status state machine:**\n`pending` \u2192 `queued` \u2192 `processing` \u2192 `complete` | `failed`\n\n## Performance\n\n| Document size | Expected latency | Max timeout |\n|---------------|------------------|-------------|\n| 1\u20135 pages | Sync, <3s | 30s |\n| 6\u201350 pages | <30s average | 5 min |\n| 50+ pages | <5 min average | 30 min |\n\n**Uptime SLA:** 99.5% (Build), 99.9% (Scale), custom (Enterprise).\n\n**Max file size:** 500 MB. JSON request bodies (schemas, jobs): 1 MB.\n\n**Idempotency:** Pass `Idempotency-Key` header on POST requests. Keys are\nvalid for 24 hours and scoped per API key. Duplicates return the cached\nresponse with `cached: true`.\n',
7
+ description: 'Structure any document into schema-validated data.\n\nThe Talonic API lets you extract structured data from documents (PDFs, images,\nDOCX, CSV, plain text), manage reusable extraction schemas, track async jobs,\nand organise documents through sources.\n\n## Quick Start\n\n**1. Get your API key**\n\nSign up at [app.talonic.com](https://app.talonic.com) \u2192 Settings \u2192 API Keys \u2192 Create key.\nKeys start with `tlnc_live_` (production) or `tlnc_test_` (sandbox).\nAll examples below use `tlnc_live_abc123` as a placeholder.\n\n**2. Extract your first document**\n\n```bash\ncurl -X POST https://api.talonic.com/v1/extract \\\n -H "Authorization: Bearer tlnc_live_abc123" \\\n -F "file=@invoice.pdf" \\\n -F \'schema={"properties":{"vendor_name":{"type":"string"},"total_amount":{"type":"number"},"invoice_date":{"type":"string"}}}\'\n```\n\n**Python:**\n```python\nimport requests\nresp = requests.post("https://api.talonic.com/v1/extract",\n headers={"Authorization": "Bearer tlnc_live_abc123"},\n files={"file": open("invoice.pdf", "rb")},\n data={"schema": \'{"properties":{"vendor_name":{"type":"string"},"total_amount":{"type":"number"},"invoice_date":{"type":"string"}}}\'})\nprint(resp.json()["data"])\n```\n\n**TypeScript:**\n```typescript\nconst form = new FormData();\nform.append("file", fs.createReadStream("invoice.pdf"));\nform.append("schema", \'{"properties":{"vendor_name":{"type":"string"},"total_amount":{"type":"number"},"invoice_date":{"type":"string"}}}\');\nconst res = await fetch("https://api.talonic.com/v1/extract", {\n method: "POST",\n headers: { Authorization: "Bearer tlnc_live_abc123" },\n body: form,\n}).then(r => r.json());\nconsole.log(res.data);\n```\n\n**3. What you get back**\n\n```json\n{\n "extraction_id": "d1a2b3c4-5678-9abc-def0-1234567890ab",\n "request_id": "req_x7y8z9a0b1c2d3e4",\n "status": "complete",\n "document": {\n "id": "f0e1d2c3-b4a5-9687-8765-432109876543",\n "filename": "invoice.pdf",\n "pages": 2,\n "size_bytes": 184320,\n "type_detected": "Invoice",\n "language_detected": "en"\n },\n "data": {\n "vendor_name": "Acme GmbH",\n "total_amount": 14250.00,\n "invoice_date": "2025-03-15"\n },\n "confidence": {\n "overall": 0.96,\n "fields": {\n "vendor_name": 0.97,\n "total_amount": 0.94,\n "invoice_date": 0.99\n }\n },\n "processing": {\n "duration_ms": 1840,\n "pages_processed": 2,\n "region": "eu-west"\n },\n "links": {\n "self": "/v1/extractions/d1a2b3c4-5678-9abc-def0-1234567890ab",\n "document": "/v1/documents/f0e1d2c3-b4a5-9687-8765-432109876543"\n }\n}\n```\n\n- **`data`** \u2014 extracted fields as key-value pairs matching your schema.\n- **`confidence.fields`** \u2014 per-field score from 0 to 1. Above 0.9 is high confidence; below 0.7 flags for review.\n- **`extraction_id`** \u2014 use this to retrieve, correct, or deliver results later.\n- Full response schema: [ExtractSyncResponse](#/components/schemas/ExtractSyncResponse)\n\n**4. Next steps**\n\n- **50+ pages?** Use async mode \u2014 see [Async Extraction Flow](#section/Async-Extraction-Flow) below.\n- **Reusable schemas** \u2014 save field definitions with `POST /v1/schemas`, then pass `schema_id` on future extractions.\n- **Receive results via webhook** \u2014 configure a delivery destination and listen for `document.extracted` events. See the [Delivery](#tag/Delivery) tag.\n\n---\n\n## Authentication\n\nAll requests require a Bearer token in the `Authorization` header.\nAPI keys are prefixed with `tlnc_` and scoped per customer.\n\n```\nAuthorization: Bearer tlnc_live_abc123...\n```\n\n## Async Extraction Pattern\n\nSmall documents (\u22645 pages) are processed synchronously and return a `200`\nwith the extracted data immediately. Larger documents return a `202 Accepted`\nwith a `poll_url` \u2014 poll `GET /v1/documents/{id}` until `status` transitions\nto `completed`, then fetch results via `GET /v1/documents/{id}/extractions`.\n\nYou can force async processing by passing `options: {"async": true}` on\nany extraction request. Combine with webhooks for a fully event-driven flow:\nconfigure a webhook destination under Delivery and listen for the\n`extraction.complete` event.\n\n**Job status lifecycle:** `pending` \u2192 `processing` \u2192 `complete` | `failed`\n\n## Rate Limits\n\nRequests are metered per calendar day (UTC). Limits depend on your plan tier:\n\n| Tier | Extract | Platform | Ingest |\n|------------|---------|----------|--------|\n| Free | 50/day | 500/day | 50/day |\n| Pro | 2,000 | 10,000 | 2,000 |\n| Enterprise | Unlimited | Unlimited | Unlimited |\n\nEvery response includes rate-limit headers:\n- `X-RateLimit-Limit` \u2014 daily cap for the namespace\n- `X-RateLimit-Remaining` \u2014 requests left today\n- `X-RateLimit-Reset` \u2014 ISO 8601 timestamp when the window resets (midnight UTC)\n\n## Pagination\n\nList endpoints use cursor-based pagination. Pass `limit` (1\u2013100, default 20),\n`cursor` (opaque token from `pagination.next_cursor`), and `order` (`asc` or `desc`, default `desc`).\n\n## Errors\n\nAll errors return a JSON body with `error` (machine-readable code) and `message`\n(human-readable explanation). Additional fields vary by error type.\n\n| Code | Error | Description |\n|------|--------------------|------------------------------------------|\n| 400 | validation_error | Request body is malformed or invalid |\n| 401 | unauthorized | Missing or invalid API key |\n| 403 | insufficient_scope | API key lacks the required scope |\n| 404 | not_found | Resource does not exist |\n| 409 | conflict | Resource state conflict |\n| 413 | payload_too_large | File exceeds 500 MB limit |\n| 422 | extraction_failed | Document could not be processed |\n| 429 | rate_limit_exceeded| Daily rate limit reached |\n| 500 | internal_error | Unexpected server error (retryable) |\n\nEvery error response follows this envelope:\n\n```json\n{\n "statusCode": 400,\n "code": "VALIDATION_ERROR",\n "error": "Bad Request",\n "message": "name is required.",\n "retryable": false,\n "timestamp": "2026-04-25T14:30:00.000Z",\n "path": "/v1/schemas"\n}\n```\n\nThe `code` field is one of: `VALIDATION_ERROR`, `AUTH_REQUIRED`, `TOKEN_EXPIRED`,\n`INSUFFICIENT_PERMISSIONS`, `RESOURCE_NOT_FOUND`, `QUOTA_EXCEEDED`,\n`INSUFFICIENT_CREDITS`, `LLM_RATE_LIMITED`, `LLM_TIMEOUT`, `LLM_UNAVAILABLE`,\n`OCR_FAILED`, `EXTRACTION_FAILED`, `EXTRACTION_TIMEOUT`, `FILE_TOO_LARGE`,\n`DUPLICATE_RESOURCE`, `DATASPACE_RUN_FAILED`, `INTERNAL_ERROR`.\n\n## Async Extraction Flow\n\nDocuments \u22645 pages return results synchronously (`200`). Larger documents\n\u2014 or any request with `options: {"async": true}` \u2014 return `202 Accepted`.\n\n**1. Submit extraction:**\n\n```bash\ncurl -X POST https://api.talonic.com/v1/extract \\\n -H "Authorization: Bearer tlnc_live_abc123" \\\n -F "file=@contract.pdf" \\\n -F \'options={"async": true}\'\n```\n\nResponse `202`:\n```json\n{\n "request_id": "req_x7y8z9a0",\n "status": "processing",\n "document": { "id": "f0e1d2c3-b4a5-9687-8765-432109876543" },\n "poll_url": "/v1/documents/f0e1d2c3-b4a5-9687-8765-432109876543"\n}\n```\n\n**2. Poll until complete:**\n\n```bash\ncurl https://api.talonic.com/v1/documents/f0e1d2c3-b4a5-9687-8765-432109876543 \\\n -H "Authorization: Bearer tlnc_live_abc123"\n```\n\nWhile processing: `{ "status": "processing" }`\nWhen done: `{ "status": "completed" }`\n\n**3. Retrieve results:**\n\n```bash\ncurl https://api.talonic.com/v1/documents/f0e1d2c3-b4a5-9687-8765-432109876543/extractions \\\n -H "Authorization: Bearer tlnc_live_abc123"\n```\n\n**Python \u2014 complete async flow with exponential backoff:**\n\n```python\nimport time\nimport requests\n\nAPI_KEY = "tlnc_live_..."\nBASE = "https://api.talonic.com/v1"\nHEADERS = {"Authorization": f"Bearer {API_KEY}"}\n\n# Step 1: Submit async extraction\nresp = requests.post(f"{BASE}/extract",\n headers=HEADERS,\n files={"file": open("contract.pdf", "rb")},\n data={"options": \'{"async": true}\'})\ndoc_id = resp.json()["document"]["id"]\n\n# Step 2: Poll with exponential backoff (2s \u2192 4s \u2192 8s \u2192 16s \u2192 30s cap)\ndelay = 2\nfor _ in range(20):\n time.sleep(delay)\n doc = requests.get(f"{BASE}/documents/{doc_id}", headers=HEADERS).json()\n if doc["status"] == "completed":\n break\n if doc["status"] == "error":\n raise Exception(f"Extraction failed: {doc.get(\'error\')}")\n delay = min(delay * 2, 30)\n\n# Step 3: Retrieve extracted data\nextractions = requests.get(\n f"{BASE}/documents/{doc_id}/extractions", headers=HEADERS).json()\ndata = extractions["data"][0]["data"]\nconfidence = extractions["data"][0]["confidence"]["overall"]\nprint(f"Extracted {len(data)} fields (confidence: {confidence})")\nprint(data)\n# \u2192 {"vendor_name": "Acme Corp", "total_amount": 1250.00, ...}\n```\n\n**TypeScript \u2014 same flow:**\n\n```typescript\nconst API_KEY = "tlnc_live_...";\nconst BASE = "https://api.talonic.com/v1";\nconst headers = { Authorization: `Bearer ${API_KEY}` };\n\n// Step 1: Submit async extraction\nconst form = new FormData();\nform.append("file", fs.createReadStream("contract.pdf"));\nform.append("options", \'{"async": true}\');\nconst { document } = await fetch(`${BASE}/extract`, {\n method: "POST", headers, body: form,\n}).then((r) => r.json());\n\n// Step 2: Poll with exponential backoff\nlet delay = 2000;\nlet doc: any;\nfor (let i = 0; i < 20; i++) {\n await new Promise((r) => setTimeout(r, delay));\n doc = await fetch(`${BASE}/documents/${document.id}`, { headers }).then((r) => r.json());\n if (doc.status === "completed") break;\n if (doc.status === "error") throw new Error(`Extraction failed: ${doc.error}`);\n delay = Math.min(delay * 2, 30_000);\n}\n\n// Step 3: Retrieve extracted data\nconst { data: extractions } = await fetch(\n `${BASE}/documents/${document.id}/extractions`, { headers }\n).then((r) => r.json());\nconsole.log(extractions[0].data);\n// \u2192 { vendor_name: "Acme Corp", total_amount: 1250.00, ... }\n```\n\nRecommended polling: 2s initial, exponential backoff (2\u21924\u21928\u219216\u219230s cap),\ntimeout after 5 minutes.\n\n**Alternative \u2014 Webhooks:** Configure a delivery destination and listen for\n`document.extracted` events. See the Delivery tag.\n\n**Job status state machine:**\n`pending` \u2192 `queued` \u2192 `processing` \u2192 `complete` | `failed`\n\n## Performance\n\n| Document size | Expected latency | Max timeout |\n|---------------|------------------|-------------|\n| 1\u20135 pages | Sync, <3s | 30s |\n| 6\u201350 pages | <30s average | 5 min |\n| 50+ pages | <5 min average | 30 min |\n\n**Uptime SLA:** 99.5% (Pro), custom (Enterprise).\n\n**Max file size:** 500 MB. JSON request bodies (schemas, jobs): 1 MB.\n\n**Idempotency:** Pass `Idempotency-Key` header on POST requests. Keys are\nvalid for 24 hours and scoped per API key. Duplicates return the cached\nresponse with `cached: true`.\n',
8
8
  contact: {
9
9
  name: "Talonic Support",
10
10
  email: "support@talonic.ai",
@@ -10477,6 +10477,481 @@ var openapi_default = {
10477
10477
  }
10478
10478
  }
10479
10479
  }
10480
+ },
10481
+ "/v1/registry/query": {
10482
+ post: {
10483
+ operationId: "registryQuery",
10484
+ summary: "Query extracted field values across documents",
10485
+ description: "Search previously-extracted field values across all documents without re-extraction. Zero AI calls. Filter by field values and select which fields to return. Max 500 rows.",
10486
+ tags: [
10487
+ "Platform"
10488
+ ],
10489
+ requestBody: {
10490
+ required: true,
10491
+ content: {
10492
+ "application/json": {
10493
+ schema: {
10494
+ type: "object",
10495
+ required: [
10496
+ "where"
10497
+ ],
10498
+ properties: {
10499
+ where: {
10500
+ type: "object",
10501
+ description: "Field-value conditions. Keys are field names, values are expected values. All conditions are ANDed.",
10502
+ additionalProperties: {
10503
+ type: "string"
10504
+ }
10505
+ },
10506
+ select: {
10507
+ type: "array",
10508
+ items: {
10509
+ type: "string"
10510
+ },
10511
+ description: "Field names to return in results. If omitted, returns all fields referenced in where."
10512
+ },
10513
+ limit: {
10514
+ type: "integer",
10515
+ default: 100,
10516
+ maximum: 500,
10517
+ description: "Maximum rows to return (default 100, max 500)."
10518
+ }
10519
+ }
10520
+ },
10521
+ example: {
10522
+ where: {
10523
+ vendor_name: "Meridian Energy AG",
10524
+ contract_year: "2026"
10525
+ },
10526
+ select: [
10527
+ "contract_value",
10528
+ "auto_renew",
10529
+ "notice_period_days"
10530
+ ],
10531
+ limit: 50
10532
+ }
10533
+ }
10534
+ }
10535
+ },
10536
+ responses: {
10537
+ "200": {
10538
+ description: "Matching documents with their field values.",
10539
+ content: {
10540
+ "application/json": {
10541
+ schema: {
10542
+ type: "object",
10543
+ properties: {
10544
+ data: {
10545
+ type: "array",
10546
+ items: {
10547
+ type: "object",
10548
+ properties: {
10549
+ document_id: {
10550
+ type: "string",
10551
+ format: "uuid"
10552
+ },
10553
+ filename: {
10554
+ type: "string"
10555
+ },
10556
+ document_type: {
10557
+ type: "string",
10558
+ nullable: true
10559
+ }
10560
+ },
10561
+ additionalProperties: {
10562
+ type: "string"
10563
+ }
10564
+ }
10565
+ },
10566
+ total: {
10567
+ type: "integer"
10568
+ }
10569
+ }
10570
+ }
10571
+ }
10572
+ }
10573
+ },
10574
+ "400": {
10575
+ description: "Missing where or unknown field name."
10576
+ },
10577
+ "401": {
10578
+ description: "Missing or invalid API key."
10579
+ },
10580
+ "429": {
10581
+ description: "Rate limit exceeded."
10582
+ }
10583
+ }
10584
+ }
10585
+ },
10586
+ "/v1/saved-filters": {
10587
+ get: {
10588
+ operationId: "listSavedFilters",
10589
+ summary: "List saved filters",
10590
+ description: "Returns all saved filter configurations, optionally scoped to a source.",
10591
+ tags: [
10592
+ "Documents"
10593
+ ],
10594
+ parameters: [
10595
+ {
10596
+ name: "sourceId",
10597
+ in: "query",
10598
+ schema: {
10599
+ type: "string"
10600
+ },
10601
+ description: "Filter by source connection."
10602
+ }
10603
+ ],
10604
+ responses: {
10605
+ "200": {
10606
+ description: "List of saved filters.",
10607
+ content: {
10608
+ "application/json": {
10609
+ schema: {
10610
+ type: "object",
10611
+ properties: {
10612
+ data: {
10613
+ type: "array",
10614
+ items: {
10615
+ type: "object",
10616
+ properties: {
10617
+ id: {
10618
+ type: "string",
10619
+ format: "uuid"
10620
+ },
10621
+ name: {
10622
+ type: "string"
10623
+ },
10624
+ conditions: {
10625
+ type: "array",
10626
+ items: {
10627
+ type: "object"
10628
+ }
10629
+ },
10630
+ search: {
10631
+ type: "string",
10632
+ nullable: true
10633
+ },
10634
+ sort: {
10635
+ type: "object",
10636
+ nullable: true
10637
+ },
10638
+ source_connection_id: {
10639
+ type: "string",
10640
+ nullable: true
10641
+ },
10642
+ created_at: {
10643
+ type: "string",
10644
+ format: "date-time"
10645
+ }
10646
+ }
10647
+ }
10648
+ }
10649
+ }
10650
+ }
10651
+ }
10652
+ }
10653
+ }
10654
+ }
10655
+ },
10656
+ post: {
10657
+ operationId: "createSavedFilter",
10658
+ summary: "Create a saved filter",
10659
+ description: "Persist a filter configuration for reuse.",
10660
+ tags: [
10661
+ "Documents"
10662
+ ],
10663
+ requestBody: {
10664
+ required: true,
10665
+ content: {
10666
+ "application/json": {
10667
+ schema: {
10668
+ type: "object",
10669
+ required: [
10670
+ "name",
10671
+ "conditions"
10672
+ ],
10673
+ properties: {
10674
+ name: {
10675
+ type: "string",
10676
+ description: "Display name for the saved filter."
10677
+ },
10678
+ conditions: {
10679
+ type: "array",
10680
+ items: {
10681
+ type: "object"
10682
+ },
10683
+ description: "Array of filter conditions."
10684
+ },
10685
+ search: {
10686
+ type: "string",
10687
+ description: "Optional free-text search."
10688
+ },
10689
+ sort: {
10690
+ type: "object",
10691
+ description: "Optional sort configuration."
10692
+ },
10693
+ source_connection_id: {
10694
+ type: "string",
10695
+ description: "Scope to a specific source."
10696
+ }
10697
+ }
10698
+ }
10699
+ }
10700
+ }
10701
+ },
10702
+ responses: {
10703
+ "201": {
10704
+ description: "Saved filter created."
10705
+ },
10706
+ "401": {
10707
+ description: "Missing or invalid API key."
10708
+ }
10709
+ }
10710
+ }
10711
+ },
10712
+ "/v1/saved-filters/{id}": {
10713
+ delete: {
10714
+ operationId: "deleteSavedFilter",
10715
+ summary: "Delete a saved filter",
10716
+ tags: [
10717
+ "Documents"
10718
+ ],
10719
+ parameters: [
10720
+ {
10721
+ name: "id",
10722
+ in: "path",
10723
+ required: true,
10724
+ schema: {
10725
+ type: "string",
10726
+ format: "uuid"
10727
+ }
10728
+ }
10729
+ ],
10730
+ responses: {
10731
+ "200": {
10732
+ description: "Filter deleted."
10733
+ },
10734
+ "404": {
10735
+ description: "Saved filter not found."
10736
+ }
10737
+ }
10738
+ }
10739
+ },
10740
+ "/v1/webhooks": {
10741
+ get: {
10742
+ operationId: "listWebhooks",
10743
+ summary: "List webhook configurations",
10744
+ description: "Returns all webhook configurations for the customer.",
10745
+ tags: [
10746
+ "Delivery"
10747
+ ],
10748
+ responses: {
10749
+ "200": {
10750
+ description: "List of webhook configurations.",
10751
+ content: {
10752
+ "application/json": {
10753
+ schema: {
10754
+ type: "object",
10755
+ properties: {
10756
+ data: {
10757
+ type: "array",
10758
+ items: {
10759
+ type: "object",
10760
+ properties: {
10761
+ id: {
10762
+ type: "string",
10763
+ format: "uuid"
10764
+ },
10765
+ url: {
10766
+ type: "string",
10767
+ format: "uri"
10768
+ },
10769
+ events: {
10770
+ type: "array",
10771
+ items: {
10772
+ type: "string"
10773
+ }
10774
+ },
10775
+ source_id: {
10776
+ type: "string",
10777
+ nullable: true
10778
+ },
10779
+ active: {
10780
+ type: "boolean"
10781
+ },
10782
+ created_at: {
10783
+ type: "string",
10784
+ format: "date-time"
10785
+ }
10786
+ }
10787
+ }
10788
+ }
10789
+ }
10790
+ }
10791
+ }
10792
+ }
10793
+ }
10794
+ }
10795
+ },
10796
+ post: {
10797
+ operationId: "createWebhook",
10798
+ summary: "Create a webhook configuration",
10799
+ description: "Configure a new webhook endpoint to receive event notifications.",
10800
+ tags: [
10801
+ "Delivery"
10802
+ ],
10803
+ requestBody: {
10804
+ required: true,
10805
+ content: {
10806
+ "application/json": {
10807
+ schema: {
10808
+ type: "object",
10809
+ required: [
10810
+ "url",
10811
+ "events"
10812
+ ],
10813
+ properties: {
10814
+ url: {
10815
+ type: "string",
10816
+ format: "uri",
10817
+ description: "HTTPS endpoint URL."
10818
+ },
10819
+ events: {
10820
+ type: "array",
10821
+ items: {
10822
+ type: "string"
10823
+ },
10824
+ description: "Event types to subscribe to."
10825
+ },
10826
+ source_id: {
10827
+ type: "string",
10828
+ description: "Scope to a specific source (optional)."
10829
+ },
10830
+ secret: {
10831
+ type: "string",
10832
+ description: "Signing secret. Auto-generated if omitted."
10833
+ }
10834
+ }
10835
+ }
10836
+ }
10837
+ }
10838
+ },
10839
+ responses: {
10840
+ "201": {
10841
+ description: "Webhook created. Returns the webhook config including the signing secret."
10842
+ },
10843
+ "400": {
10844
+ description: "Invalid URL or event types."
10845
+ },
10846
+ "401": {
10847
+ description: "Missing or invalid API key."
10848
+ }
10849
+ }
10850
+ }
10851
+ },
10852
+ "/v1/webhooks/{id}": {
10853
+ get: {
10854
+ operationId: "getWebhook",
10855
+ summary: "Get webhook configuration",
10856
+ tags: [
10857
+ "Delivery"
10858
+ ],
10859
+ parameters: [
10860
+ {
10861
+ name: "id",
10862
+ in: "path",
10863
+ required: true,
10864
+ schema: {
10865
+ type: "string",
10866
+ format: "uuid"
10867
+ }
10868
+ }
10869
+ ],
10870
+ responses: {
10871
+ "200": {
10872
+ description: "Webhook configuration."
10873
+ },
10874
+ "404": {
10875
+ description: "Webhook not found."
10876
+ }
10877
+ }
10878
+ },
10879
+ patch: {
10880
+ operationId: "updateWebhook",
10881
+ summary: "Update webhook configuration",
10882
+ tags: [
10883
+ "Delivery"
10884
+ ],
10885
+ parameters: [
10886
+ {
10887
+ name: "id",
10888
+ in: "path",
10889
+ required: true,
10890
+ schema: {
10891
+ type: "string",
10892
+ format: "uuid"
10893
+ }
10894
+ }
10895
+ ],
10896
+ requestBody: {
10897
+ content: {
10898
+ "application/json": {
10899
+ schema: {
10900
+ type: "object",
10901
+ properties: {
10902
+ url: {
10903
+ type: "string",
10904
+ format: "uri"
10905
+ },
10906
+ events: {
10907
+ type: "array",
10908
+ items: {
10909
+ type: "string"
10910
+ }
10911
+ },
10912
+ active: {
10913
+ type: "boolean"
10914
+ }
10915
+ }
10916
+ }
10917
+ }
10918
+ }
10919
+ },
10920
+ responses: {
10921
+ "200": {
10922
+ description: "Webhook updated."
10923
+ },
10924
+ "404": {
10925
+ description: "Webhook not found."
10926
+ }
10927
+ }
10928
+ },
10929
+ delete: {
10930
+ operationId: "deleteWebhook",
10931
+ summary: "Delete webhook configuration",
10932
+ tags: [
10933
+ "Delivery"
10934
+ ],
10935
+ parameters: [
10936
+ {
10937
+ name: "id",
10938
+ in: "path",
10939
+ required: true,
10940
+ schema: {
10941
+ type: "string",
10942
+ format: "uuid"
10943
+ }
10944
+ }
10945
+ ],
10946
+ responses: {
10947
+ "200": {
10948
+ description: "Webhook deleted."
10949
+ },
10950
+ "404": {
10951
+ description: "Webhook not found."
10952
+ }
10953
+ }
10954
+ }
10480
10955
  }
10481
10956
  },
10482
10957
  components: {
@@ -16304,7 +16779,9 @@ var API_NAV_SECTIONS = [
16304
16779
  { id: "introduction", label: "Introduction" },
16305
16780
  { id: "authentication", label: "Authentication" },
16306
16781
  { id: "base-url", label: "Base URL" },
16307
- { id: "quick-start", label: "Quick Start" }
16782
+ { id: "quick-start", label: "Quick Start" },
16783
+ { id: "pagination", label: "Pagination" },
16784
+ { id: "idempotency", label: "Idempotency" }
16308
16785
  ] },
16309
16786
  { id: "extract", label: "Extract", children: [
16310
16787
  { id: "post-extract", label: "POST /v1/extract" },
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Tailwind CSS preset for @talonic/docs consumers.
3
+ * Adds the Void design system color tokens and font families
4
+ * so doc components render correctly in any host app.
5
+ */
6
+ declare const voidDocsPreset: {
7
+ darkMode: "class";
8
+ theme: {
9
+ extend: {
10
+ colors: {
11
+ 'void-bg': string;
12
+ 'void-bg-elevated': string;
13
+ 'void-surface': string;
14
+ 'void-surface-2': string;
15
+ 'void-surface-3': string;
16
+ 'void-border': string;
17
+ 'void-border-hover': string;
18
+ 'void-text-primary': string;
19
+ 'void-text-secondary': string;
20
+ 'void-text-muted': string;
21
+ 'void-text-tertiary': string;
22
+ 'void-accent': string;
23
+ 'void-accent-hover': string;
24
+ 'void-accent-dim': string;
25
+ 'void-accent-tint': string;
26
+ 'void-danger': string;
27
+ 'void-danger-solid': string;
28
+ 'void-divider': string;
29
+ 'void-warning': string;
30
+ 'void-warning-dim': string;
31
+ 'void-tier-1': string;
32
+ 'void-tier-2': string;
33
+ 'void-tier-3': string;
34
+ };
35
+ fontFamily: {
36
+ space: string[];
37
+ body: string[];
38
+ mono: string[];
39
+ };
40
+ };
41
+ };
42
+ plugins: never[];
43
+ };
44
+
45
+ export { voidDocsPreset as default };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Tailwind CSS preset for @talonic/docs consumers.
3
+ * Adds the Void design system color tokens and font families
4
+ * so doc components render correctly in any host app.
5
+ */
6
+ declare const voidDocsPreset: {
7
+ darkMode: "class";
8
+ theme: {
9
+ extend: {
10
+ colors: {
11
+ 'void-bg': string;
12
+ 'void-bg-elevated': string;
13
+ 'void-surface': string;
14
+ 'void-surface-2': string;
15
+ 'void-surface-3': string;
16
+ 'void-border': string;
17
+ 'void-border-hover': string;
18
+ 'void-text-primary': string;
19
+ 'void-text-secondary': string;
20
+ 'void-text-muted': string;
21
+ 'void-text-tertiary': string;
22
+ 'void-accent': string;
23
+ 'void-accent-hover': string;
24
+ 'void-accent-dim': string;
25
+ 'void-accent-tint': string;
26
+ 'void-danger': string;
27
+ 'void-danger-solid': string;
28
+ 'void-divider': string;
29
+ 'void-warning': string;
30
+ 'void-warning-dim': string;
31
+ 'void-tier-1': string;
32
+ 'void-tier-2': string;
33
+ 'void-tier-3': string;
34
+ };
35
+ fontFamily: {
36
+ space: string[];
37
+ body: string[];
38
+ mono: string[];
39
+ };
40
+ };
41
+ };
42
+ plugins: never[];
43
+ };
44
+
45
+ export { voidDocsPreset as default };