@talonic/docs 0.19.3 → 0.20.1
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/content.js +324 -78
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/seo.js +479 -2
- package/openapi.json +519 -44
- package/package.json +1 -1
package/openapi.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "Talonic API",
|
|
5
5
|
"version": "1.0.0",
|
|
6
|
-
"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) → Settings → API Keys → 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`** — extracted fields as key-value pairs matching your schema.\n- **`confidence.fields`** — per-field score from 0 to 1. Above 0.9 is high confidence; below 0.7 flags for review.\n- **`extraction_id`** — 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 — see [Async Extraction Flow](#section/Async-Extraction-Flow) below.\n- **Reusable schemas** — save field definitions with `POST /v1/schemas`, then pass `schema_id` on future extractions.\n- **Receive results via webhook** — 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 (≤5 pages) are processed synchronously and return a `200`\nwith the extracted data immediately. Larger documents return a `202 Accepted`\nwith a `poll_url` — 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` → `processing` → `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` — daily cap for the namespace\n- `X-RateLimit-Remaining` — requests left today\n- `X-RateLimit-Reset` — ISO 8601 timestamp when the window resets (midnight UTC)\n\n## Pagination\n\nList endpoints use cursor-based pagination. Pass `limit` (1–100, 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 ≤5 pages return results synchronously (`200`). Larger documents\n— or any request with `options: {\"async\": true}` — 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 — 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 → 4s → 8s → 16s → 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# → {\"vendor_name\": \"Acme Corp\", \"total_amount\": 1250.00, ...}\n```\n\n**TypeScript — 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// → { vendor_name: \"Acme Corp\", total_amount: 1250.00, ... }\n```\n\nRecommended polling: 2s initial, exponential backoff (2→4→8→16→30s cap),\ntimeout after 5 minutes.\n\n**Alternative — Webhooks:** Configure a delivery destination and listen for\n`document.extracted` events. See the Delivery tag.\n\n**Job status state machine:**\n`pending` → `queued` → `processing` → `complete` | `failed`\n\n## Performance\n\n| Document size | Expected latency | Max timeout |\n|---------------|------------------|-------------|\n| 1–5 pages | Sync, <3s | 30s |\n| 6–50 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",
|
|
6
|
+
"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",
|
|
7
7
|
"contact": {
|
|
8
8
|
"name": "Talonic Support",
|
|
9
9
|
"email": "support@talonic.ai",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
"name": "Delivery",
|
|
58
|
-
"description": "Outbound delivery pipeline
|
|
58
|
+
"description": "Outbound delivery pipeline \u2014 routing rules, delivery destinations (webhook, SFTP,\nS3, Azure Blob, Google Drive, OneDrive), bindings, filters, and the delivery\nhistory/DLQ/events log.\n\n## Webhook Contract\n\n**Event payload:**\n```json\n{\n \"event\": {\n \"event_type\": \"document.extracted\",\n \"event_id\": \"42\",\n \"binding_id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"idempotency_key\": \"c9f3a7e1b2d4f6a8e0c2d4f6a8e0c2d4\",\n \"attempt\": 1,\n \"delivered_at\": \"2026-04-25T14:30:00.000Z\"\n },\n \"payload\": { \"document_id\": \"...\", \"data\": { \"...extracted fields...\" } }\n}\n```\n\n**Event types:** `document.extracted`, `document.extraction_failed`,\n`run.dataspace.completed`, `run.dataspace.failed`, `result.dataspace.completed`,\n`result.dataspace.failed`, `run.structuring.completed`, `run.structuring.failed`,\n`run.resolution.completed`, `run.resolution.failed`, `run.extraction.completed`,\n`run.extraction.failed`, `result.flagged`, `result.approved`, `result.rejected`,\n`delivery.item.completed`, `delivery.item.failed`.\n\n**Signature verification (HMAC-SHA256):**\n\nHeader: `X-Talonic-Signature: t=1714060200000,v1=abc123...`\n\n```javascript\nconst crypto = require('crypto');\nconst [tPart, vPart] = signature.split(',');\nconst timestamp = tPart.split('=')[1];\nconst received = vPart.split('=')[1];\nconst expected = crypto.createHmac('sha256', signingSecret)\n .update(timestamp + '.' + rawBody).digest('hex');\nconst valid = crypto.timingSafeEqual(\n Buffer.from(received), Buffer.from(expected));\n```\n\n**Retry policy:** Up to 7 attempts \u2014 0s, 30s, 2m, 8m, 30m, 2h, 8h (~10.5h total).\nHTTP 429/5xx are retryable. HTTP 4xx (except 408) goes to DLQ immediately.\n\n**Dead-letter queue recovery:** When all retries are exhausted, the delivery\nlands in the DLQ. List failed deliveries with `GET /v1/delivery/dlq`\n(filterable by `binding_id` and `error_code`). Inspect a single entry with\n`GET /v1/delivery/dlq/{id}`. Replay with `POST /v1/delivery/dlq/{id}/replay`\n\u2014 this deletes the DLQ entry, re-signs the payload with the current\nsigning secret, resets the retry counter to attempt 1, and re-enqueues\nthe delivery through the full backoff ladder.\n"
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
"name": "Intelligence",
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
},
|
|
124
124
|
"options": {
|
|
125
125
|
"type": "string",
|
|
126
|
-
"description": "JSON string of extraction options.\n- `async` (boolean)
|
|
126
|
+
"description": "JSON string of extraction options.\n- `async` (boolean) \u2014 force async (`true`) or sync (`false`) processing.\n"
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
},
|
|
@@ -1934,7 +1934,7 @@
|
|
|
1934
1934
|
"batch"
|
|
1935
1935
|
],
|
|
1936
1936
|
"default": "realtime",
|
|
1937
|
-
"description": "\"realtime\" (default)
|
|
1937
|
+
"description": "\"realtime\" (default) \u2014 processed immediately.\n\"batch\" \u2014 50% cost discount, results within 48 hours.\n"
|
|
1938
1938
|
}
|
|
1939
1939
|
}
|
|
1940
1940
|
}
|
|
@@ -2411,7 +2411,7 @@
|
|
|
2411
2411
|
"put": {
|
|
2412
2412
|
"operationId": "updateMatchingConfig",
|
|
2413
2413
|
"summary": "Update a matching configuration",
|
|
2414
|
-
"description": "Partial update
|
|
2414
|
+
"description": "Partial update \u2014 only provided keys are applied.",
|
|
2415
2415
|
"tags": [
|
|
2416
2416
|
"Intelligence"
|
|
2417
2417
|
],
|
|
@@ -3094,7 +3094,7 @@
|
|
|
3094
3094
|
"post": {
|
|
3095
3095
|
"operationId": "testDeliveryDestination",
|
|
3096
3096
|
"summary": "Live-ping a destination through the full transport envelope",
|
|
3097
|
-
"description": "Exercises the complete delivery envelope (SSRF guard, payload cap, rate\nlimit, retry ladder is disabled
|
|
3097
|
+
"description": "Exercises the complete delivery envelope (SSRF guard, payload cap, rate\nlimit, retry ladder is disabled \u2014 `max_attempts: 1`) with a tiny test\npayload. The returned `success` field reflects whether the connector's\n`deliver()` call returned a non-retryable success; check `httpStatus`\nand `message` for details.\n",
|
|
3098
3098
|
"tags": [
|
|
3099
3099
|
"Delivery"
|
|
3100
3100
|
],
|
|
@@ -3328,7 +3328,7 @@
|
|
|
3328
3328
|
"post": {
|
|
3329
3329
|
"operationId": "previewDeliveryBinding",
|
|
3330
3330
|
"summary": "Synthetic-signal dry-run preview",
|
|
3331
|
-
"description": "Builds a synthetic {DeliveryEvent} that matches the binding's\n`signal_filter.event_type` (overlaying any `signal_filter.match`\nconstraints), then walks the delivery pipeline up to
|
|
3331
|
+
"description": "Builds a synthetic {DeliveryEvent} that matches the binding's\n`signal_filter.event_type` (overlaying any `signal_filter.match`\nconstraints), then walks the delivery pipeline up to \u2014 but NOT\nincluding \u2014 `connector.deliver()`:\n`resolver.resolve(signal) \u2192 projectFieldMap \u2192 serializer.serialize`.\n\nWhen the resolver can load a real entity, `sample_mode` is `\"real\"`\nand `projected` / `serialized` / `wire_preview` are populated. If the\nresolver throws (typically `EntityMissingError` because the synthetic\nentity id doesn't exist in this tenant), the service falls back to\n`sample_mode: \"structural\"` \u2014 it returns the resolver's declared\n`shape` without concrete data. The preview never makes a network\ncall, never inserts a delivery row, and never touches the DLQ.\n",
|
|
3332
3332
|
"tags": [
|
|
3333
3333
|
"Delivery"
|
|
3334
3334
|
],
|
|
@@ -3339,7 +3339,7 @@
|
|
|
3339
3339
|
],
|
|
3340
3340
|
"responses": {
|
|
3341
3341
|
"200": {
|
|
3342
|
-
"description": "Preview response
|
|
3342
|
+
"description": "Preview response \u2014 real dry-run or structural fallback.",
|
|
3343
3343
|
"content": {
|
|
3344
3344
|
"application/json": {
|
|
3345
3345
|
"schema": {
|
|
@@ -3347,7 +3347,7 @@
|
|
|
3347
3347
|
},
|
|
3348
3348
|
"examples": {
|
|
3349
3349
|
"real": {
|
|
3350
|
-
"summary": "Real dry-run
|
|
3350
|
+
"summary": "Real dry-run \u2014 resolver loaded a synthetic entity and every pipeline stage ran.",
|
|
3351
3351
|
"value": {
|
|
3352
3352
|
"available": true,
|
|
3353
3353
|
"sample_mode": "real",
|
|
@@ -3383,7 +3383,7 @@
|
|
|
3383
3383
|
}
|
|
3384
3384
|
},
|
|
3385
3385
|
"structural": {
|
|
3386
|
-
"summary": "Structural fallback
|
|
3386
|
+
"summary": "Structural fallback \u2014 the resolver couldn't load the synthetic entity, so only the declared shape is returned.",
|
|
3387
3387
|
"value": {
|
|
3388
3388
|
"available": true,
|
|
3389
3389
|
"sample_mode": "structural",
|
|
@@ -3586,7 +3586,7 @@
|
|
|
3586
3586
|
"post": {
|
|
3587
3587
|
"operationId": "replayDeliveryItem",
|
|
3588
3588
|
"summary": "Re-enqueue a delivery attempt",
|
|
3589
|
-
"description": "Enqueues a new attempt for the binding/event pair. Generates a new\nidempotency key
|
|
3589
|
+
"description": "Enqueues a new attempt for the binding/event pair. Generates a new\nidempotency key \u2014 replays are new attempts, never mutations.\n",
|
|
3590
3590
|
"tags": [
|
|
3591
3591
|
"Delivery"
|
|
3592
3592
|
],
|
|
@@ -3755,7 +3755,7 @@
|
|
|
3755
3755
|
"post": {
|
|
3756
3756
|
"operationId": "replayDeliveryDlq",
|
|
3757
3757
|
"summary": "Re-enqueue a dead-letter row",
|
|
3758
|
-
"description": "Inserts a fresh BullMQ job for the binding/event pair. The DLQ row is\nleft in place (append-only history)
|
|
3758
|
+
"description": "Inserts a fresh BullMQ job for the binding/event pair. The DLQ row is\nleft in place (append-only history) \u2014 it stays readable until\nexplicitly dismissed.\n",
|
|
3759
3759
|
"tags": [
|
|
3760
3760
|
"Delivery"
|
|
3761
3761
|
],
|
|
@@ -3796,7 +3796,7 @@
|
|
|
3796
3796
|
"get": {
|
|
3797
3797
|
"operationId": "listDeliveryEvents",
|
|
3798
3798
|
"summary": "List outbox events",
|
|
3799
|
-
"description": "Raw outbox rows with their processing status. Filter by `event_type`
|
|
3799
|
+
"description": "Raw outbox rows with their processing status. Filter by `event_type` \u2014\npagination via `limit` / `offset`.\n",
|
|
3800
3800
|
"tags": [
|
|
3801
3801
|
"Delivery"
|
|
3802
3802
|
],
|
|
@@ -3862,7 +3862,7 @@
|
|
|
3862
3862
|
"post": {
|
|
3863
3863
|
"operationId": "replayDeliveryEvent",
|
|
3864
3864
|
"summary": "Re-poll an outbox event",
|
|
3865
|
-
"description": "Clears `processed_at` and `processing_status` so the poller re-picks\nthe row on the next tick. The event ID is BIGSERIAL (string)
|
|
3865
|
+
"description": "Clears `processed_at` and `processing_status` so the poller re-picks\nthe row on the next tick. The event ID is BIGSERIAL (string) \u2014 no\nUUID validation.\n",
|
|
3866
3866
|
"tags": [
|
|
3867
3867
|
"Delivery"
|
|
3868
3868
|
],
|
|
@@ -4948,7 +4948,7 @@
|
|
|
4948
4948
|
"get": {
|
|
4949
4949
|
"operationId": "getCase",
|
|
4950
4950
|
"summary": "Get a case by key",
|
|
4951
|
-
"description": "Case keys are 8
|
|
4951
|
+
"description": "Case keys are 8\u201364 char hex strings (SHA-256 hash of the canonical\nentity-value set that defines the cluster). Returns the label,\nnarrative, linked documents, and anomaly count.\n",
|
|
4952
4952
|
"tags": [
|
|
4953
4953
|
"Intelligence"
|
|
4954
4954
|
],
|
|
@@ -5047,7 +5047,7 @@
|
|
|
5047
5047
|
"items": {
|
|
5048
5048
|
"type": "object",
|
|
5049
5049
|
"additionalProperties": true,
|
|
5050
|
-
"description": "Category
|
|
5050
|
+
"description": "Category \u2192 subcategory \u2192 types hierarchy. Shape is defined by `config/document-ontology.yaml`."
|
|
5051
5051
|
}
|
|
5052
5052
|
}
|
|
5053
5053
|
}
|
|
@@ -5450,7 +5450,7 @@
|
|
|
5450
5450
|
"items": {
|
|
5451
5451
|
"type": "object",
|
|
5452
5452
|
"additionalProperties": true,
|
|
5453
|
-
"description": "Row object
|
|
5453
|
+
"description": "Row object \u2014 keys match the dataset's column schema."
|
|
5454
5454
|
}
|
|
5455
5455
|
},
|
|
5456
5456
|
"pagination": {
|
|
@@ -7741,7 +7741,7 @@
|
|
|
7741
7741
|
"get": {
|
|
7742
7742
|
"operationId": "getTelemetrySchemaSummary",
|
|
7743
7743
|
"summary": "Get telemetry summary for a schema",
|
|
7744
|
-
"description": "Aggregate structuring metrics for a schema
|
|
7744
|
+
"description": "Aggregate structuring metrics for a schema \u2014 capture hit rate, synthesize rate, strategy distribution, tier funnel.",
|
|
7745
7745
|
"tags": [
|
|
7746
7746
|
"Platform"
|
|
7747
7747
|
],
|
|
@@ -7823,7 +7823,7 @@
|
|
|
7823
7823
|
"get": {
|
|
7824
7824
|
"operationId": "getTelemetrySchemaFields",
|
|
7825
7825
|
"summary": "Get per-field telemetry for a schema",
|
|
7826
|
-
"description": "Field-level structuring metrics
|
|
7826
|
+
"description": "Field-level structuring metrics \u2014 per-field state distribution, capture rates, and strategy breakdown.",
|
|
7827
7827
|
"tags": [
|
|
7828
7828
|
"Platform"
|
|
7829
7829
|
],
|
|
@@ -10346,7 +10346,7 @@
|
|
|
10346
10346
|
"get": {
|
|
10347
10347
|
"operationId": "getAgentContext",
|
|
10348
10348
|
"summary": "Get workspace context",
|
|
10349
|
-
"description": "Returns a snapshot of the workspace's current state for the embedded\nAI agent
|
|
10349
|
+
"description": "Returns a snapshot of the workspace's current state for the embedded\nAI agent \u2014 document counts, active schemas, recent jobs, and feature\nflags. Useful for bootstrapping agent conversations.\n",
|
|
10350
10350
|
"tags": [
|
|
10351
10351
|
"Platform"
|
|
10352
10352
|
],
|
|
@@ -10458,6 +10458,481 @@
|
|
|
10458
10458
|
}
|
|
10459
10459
|
}
|
|
10460
10460
|
}
|
|
10461
|
+
},
|
|
10462
|
+
"/v1/registry/query": {
|
|
10463
|
+
"post": {
|
|
10464
|
+
"operationId": "registryQuery",
|
|
10465
|
+
"summary": "Query extracted field values across documents",
|
|
10466
|
+
"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.",
|
|
10467
|
+
"tags": [
|
|
10468
|
+
"Platform"
|
|
10469
|
+
],
|
|
10470
|
+
"requestBody": {
|
|
10471
|
+
"required": true,
|
|
10472
|
+
"content": {
|
|
10473
|
+
"application/json": {
|
|
10474
|
+
"schema": {
|
|
10475
|
+
"type": "object",
|
|
10476
|
+
"required": [
|
|
10477
|
+
"where"
|
|
10478
|
+
],
|
|
10479
|
+
"properties": {
|
|
10480
|
+
"where": {
|
|
10481
|
+
"type": "object",
|
|
10482
|
+
"description": "Field-value conditions. Keys are field names, values are expected values. All conditions are ANDed.",
|
|
10483
|
+
"additionalProperties": {
|
|
10484
|
+
"type": "string"
|
|
10485
|
+
}
|
|
10486
|
+
},
|
|
10487
|
+
"select": {
|
|
10488
|
+
"type": "array",
|
|
10489
|
+
"items": {
|
|
10490
|
+
"type": "string"
|
|
10491
|
+
},
|
|
10492
|
+
"description": "Field names to return in results. If omitted, returns all fields referenced in where."
|
|
10493
|
+
},
|
|
10494
|
+
"limit": {
|
|
10495
|
+
"type": "integer",
|
|
10496
|
+
"default": 100,
|
|
10497
|
+
"maximum": 500,
|
|
10498
|
+
"description": "Maximum rows to return (default 100, max 500)."
|
|
10499
|
+
}
|
|
10500
|
+
}
|
|
10501
|
+
},
|
|
10502
|
+
"example": {
|
|
10503
|
+
"where": {
|
|
10504
|
+
"vendor_name": "Meridian Energy AG",
|
|
10505
|
+
"contract_year": "2026"
|
|
10506
|
+
},
|
|
10507
|
+
"select": [
|
|
10508
|
+
"contract_value",
|
|
10509
|
+
"auto_renew",
|
|
10510
|
+
"notice_period_days"
|
|
10511
|
+
],
|
|
10512
|
+
"limit": 50
|
|
10513
|
+
}
|
|
10514
|
+
}
|
|
10515
|
+
}
|
|
10516
|
+
},
|
|
10517
|
+
"responses": {
|
|
10518
|
+
"200": {
|
|
10519
|
+
"description": "Matching documents with their field values.",
|
|
10520
|
+
"content": {
|
|
10521
|
+
"application/json": {
|
|
10522
|
+
"schema": {
|
|
10523
|
+
"type": "object",
|
|
10524
|
+
"properties": {
|
|
10525
|
+
"data": {
|
|
10526
|
+
"type": "array",
|
|
10527
|
+
"items": {
|
|
10528
|
+
"type": "object",
|
|
10529
|
+
"properties": {
|
|
10530
|
+
"document_id": {
|
|
10531
|
+
"type": "string",
|
|
10532
|
+
"format": "uuid"
|
|
10533
|
+
},
|
|
10534
|
+
"filename": {
|
|
10535
|
+
"type": "string"
|
|
10536
|
+
},
|
|
10537
|
+
"document_type": {
|
|
10538
|
+
"type": "string",
|
|
10539
|
+
"nullable": true
|
|
10540
|
+
}
|
|
10541
|
+
},
|
|
10542
|
+
"additionalProperties": {
|
|
10543
|
+
"type": "string"
|
|
10544
|
+
}
|
|
10545
|
+
}
|
|
10546
|
+
},
|
|
10547
|
+
"total": {
|
|
10548
|
+
"type": "integer"
|
|
10549
|
+
}
|
|
10550
|
+
}
|
|
10551
|
+
}
|
|
10552
|
+
}
|
|
10553
|
+
}
|
|
10554
|
+
},
|
|
10555
|
+
"400": {
|
|
10556
|
+
"description": "Missing where or unknown field name."
|
|
10557
|
+
},
|
|
10558
|
+
"401": {
|
|
10559
|
+
"description": "Missing or invalid API key."
|
|
10560
|
+
},
|
|
10561
|
+
"429": {
|
|
10562
|
+
"description": "Rate limit exceeded."
|
|
10563
|
+
}
|
|
10564
|
+
}
|
|
10565
|
+
}
|
|
10566
|
+
},
|
|
10567
|
+
"/v1/saved-filters": {
|
|
10568
|
+
"get": {
|
|
10569
|
+
"operationId": "listSavedFilters",
|
|
10570
|
+
"summary": "List saved filters",
|
|
10571
|
+
"description": "Returns all saved filter configurations, optionally scoped to a source.",
|
|
10572
|
+
"tags": [
|
|
10573
|
+
"Documents"
|
|
10574
|
+
],
|
|
10575
|
+
"parameters": [
|
|
10576
|
+
{
|
|
10577
|
+
"name": "sourceId",
|
|
10578
|
+
"in": "query",
|
|
10579
|
+
"schema": {
|
|
10580
|
+
"type": "string"
|
|
10581
|
+
},
|
|
10582
|
+
"description": "Filter by source connection."
|
|
10583
|
+
}
|
|
10584
|
+
],
|
|
10585
|
+
"responses": {
|
|
10586
|
+
"200": {
|
|
10587
|
+
"description": "List of saved filters.",
|
|
10588
|
+
"content": {
|
|
10589
|
+
"application/json": {
|
|
10590
|
+
"schema": {
|
|
10591
|
+
"type": "object",
|
|
10592
|
+
"properties": {
|
|
10593
|
+
"data": {
|
|
10594
|
+
"type": "array",
|
|
10595
|
+
"items": {
|
|
10596
|
+
"type": "object",
|
|
10597
|
+
"properties": {
|
|
10598
|
+
"id": {
|
|
10599
|
+
"type": "string",
|
|
10600
|
+
"format": "uuid"
|
|
10601
|
+
},
|
|
10602
|
+
"name": {
|
|
10603
|
+
"type": "string"
|
|
10604
|
+
},
|
|
10605
|
+
"conditions": {
|
|
10606
|
+
"type": "array",
|
|
10607
|
+
"items": {
|
|
10608
|
+
"type": "object"
|
|
10609
|
+
}
|
|
10610
|
+
},
|
|
10611
|
+
"search": {
|
|
10612
|
+
"type": "string",
|
|
10613
|
+
"nullable": true
|
|
10614
|
+
},
|
|
10615
|
+
"sort": {
|
|
10616
|
+
"type": "object",
|
|
10617
|
+
"nullable": true
|
|
10618
|
+
},
|
|
10619
|
+
"source_connection_id": {
|
|
10620
|
+
"type": "string",
|
|
10621
|
+
"nullable": true
|
|
10622
|
+
},
|
|
10623
|
+
"created_at": {
|
|
10624
|
+
"type": "string",
|
|
10625
|
+
"format": "date-time"
|
|
10626
|
+
}
|
|
10627
|
+
}
|
|
10628
|
+
}
|
|
10629
|
+
}
|
|
10630
|
+
}
|
|
10631
|
+
}
|
|
10632
|
+
}
|
|
10633
|
+
}
|
|
10634
|
+
}
|
|
10635
|
+
}
|
|
10636
|
+
},
|
|
10637
|
+
"post": {
|
|
10638
|
+
"operationId": "createSavedFilter",
|
|
10639
|
+
"summary": "Create a saved filter",
|
|
10640
|
+
"description": "Persist a filter configuration for reuse.",
|
|
10641
|
+
"tags": [
|
|
10642
|
+
"Documents"
|
|
10643
|
+
],
|
|
10644
|
+
"requestBody": {
|
|
10645
|
+
"required": true,
|
|
10646
|
+
"content": {
|
|
10647
|
+
"application/json": {
|
|
10648
|
+
"schema": {
|
|
10649
|
+
"type": "object",
|
|
10650
|
+
"required": [
|
|
10651
|
+
"name",
|
|
10652
|
+
"conditions"
|
|
10653
|
+
],
|
|
10654
|
+
"properties": {
|
|
10655
|
+
"name": {
|
|
10656
|
+
"type": "string",
|
|
10657
|
+
"description": "Display name for the saved filter."
|
|
10658
|
+
},
|
|
10659
|
+
"conditions": {
|
|
10660
|
+
"type": "array",
|
|
10661
|
+
"items": {
|
|
10662
|
+
"type": "object"
|
|
10663
|
+
},
|
|
10664
|
+
"description": "Array of filter conditions."
|
|
10665
|
+
},
|
|
10666
|
+
"search": {
|
|
10667
|
+
"type": "string",
|
|
10668
|
+
"description": "Optional free-text search."
|
|
10669
|
+
},
|
|
10670
|
+
"sort": {
|
|
10671
|
+
"type": "object",
|
|
10672
|
+
"description": "Optional sort configuration."
|
|
10673
|
+
},
|
|
10674
|
+
"source_connection_id": {
|
|
10675
|
+
"type": "string",
|
|
10676
|
+
"description": "Scope to a specific source."
|
|
10677
|
+
}
|
|
10678
|
+
}
|
|
10679
|
+
}
|
|
10680
|
+
}
|
|
10681
|
+
}
|
|
10682
|
+
},
|
|
10683
|
+
"responses": {
|
|
10684
|
+
"201": {
|
|
10685
|
+
"description": "Saved filter created."
|
|
10686
|
+
},
|
|
10687
|
+
"401": {
|
|
10688
|
+
"description": "Missing or invalid API key."
|
|
10689
|
+
}
|
|
10690
|
+
}
|
|
10691
|
+
}
|
|
10692
|
+
},
|
|
10693
|
+
"/v1/saved-filters/{id}": {
|
|
10694
|
+
"delete": {
|
|
10695
|
+
"operationId": "deleteSavedFilter",
|
|
10696
|
+
"summary": "Delete a saved filter",
|
|
10697
|
+
"tags": [
|
|
10698
|
+
"Documents"
|
|
10699
|
+
],
|
|
10700
|
+
"parameters": [
|
|
10701
|
+
{
|
|
10702
|
+
"name": "id",
|
|
10703
|
+
"in": "path",
|
|
10704
|
+
"required": true,
|
|
10705
|
+
"schema": {
|
|
10706
|
+
"type": "string",
|
|
10707
|
+
"format": "uuid"
|
|
10708
|
+
}
|
|
10709
|
+
}
|
|
10710
|
+
],
|
|
10711
|
+
"responses": {
|
|
10712
|
+
"200": {
|
|
10713
|
+
"description": "Filter deleted."
|
|
10714
|
+
},
|
|
10715
|
+
"404": {
|
|
10716
|
+
"description": "Saved filter not found."
|
|
10717
|
+
}
|
|
10718
|
+
}
|
|
10719
|
+
}
|
|
10720
|
+
},
|
|
10721
|
+
"/v1/webhooks": {
|
|
10722
|
+
"get": {
|
|
10723
|
+
"operationId": "listWebhooks",
|
|
10724
|
+
"summary": "List webhook configurations",
|
|
10725
|
+
"description": "Returns all webhook configurations for the customer.",
|
|
10726
|
+
"tags": [
|
|
10727
|
+
"Delivery"
|
|
10728
|
+
],
|
|
10729
|
+
"responses": {
|
|
10730
|
+
"200": {
|
|
10731
|
+
"description": "List of webhook configurations.",
|
|
10732
|
+
"content": {
|
|
10733
|
+
"application/json": {
|
|
10734
|
+
"schema": {
|
|
10735
|
+
"type": "object",
|
|
10736
|
+
"properties": {
|
|
10737
|
+
"data": {
|
|
10738
|
+
"type": "array",
|
|
10739
|
+
"items": {
|
|
10740
|
+
"type": "object",
|
|
10741
|
+
"properties": {
|
|
10742
|
+
"id": {
|
|
10743
|
+
"type": "string",
|
|
10744
|
+
"format": "uuid"
|
|
10745
|
+
},
|
|
10746
|
+
"url": {
|
|
10747
|
+
"type": "string",
|
|
10748
|
+
"format": "uri"
|
|
10749
|
+
},
|
|
10750
|
+
"events": {
|
|
10751
|
+
"type": "array",
|
|
10752
|
+
"items": {
|
|
10753
|
+
"type": "string"
|
|
10754
|
+
}
|
|
10755
|
+
},
|
|
10756
|
+
"source_id": {
|
|
10757
|
+
"type": "string",
|
|
10758
|
+
"nullable": true
|
|
10759
|
+
},
|
|
10760
|
+
"active": {
|
|
10761
|
+
"type": "boolean"
|
|
10762
|
+
},
|
|
10763
|
+
"created_at": {
|
|
10764
|
+
"type": "string",
|
|
10765
|
+
"format": "date-time"
|
|
10766
|
+
}
|
|
10767
|
+
}
|
|
10768
|
+
}
|
|
10769
|
+
}
|
|
10770
|
+
}
|
|
10771
|
+
}
|
|
10772
|
+
}
|
|
10773
|
+
}
|
|
10774
|
+
}
|
|
10775
|
+
}
|
|
10776
|
+
},
|
|
10777
|
+
"post": {
|
|
10778
|
+
"operationId": "createWebhook",
|
|
10779
|
+
"summary": "Create a webhook configuration",
|
|
10780
|
+
"description": "Configure a new webhook endpoint to receive event notifications.",
|
|
10781
|
+
"tags": [
|
|
10782
|
+
"Delivery"
|
|
10783
|
+
],
|
|
10784
|
+
"requestBody": {
|
|
10785
|
+
"required": true,
|
|
10786
|
+
"content": {
|
|
10787
|
+
"application/json": {
|
|
10788
|
+
"schema": {
|
|
10789
|
+
"type": "object",
|
|
10790
|
+
"required": [
|
|
10791
|
+
"url",
|
|
10792
|
+
"events"
|
|
10793
|
+
],
|
|
10794
|
+
"properties": {
|
|
10795
|
+
"url": {
|
|
10796
|
+
"type": "string",
|
|
10797
|
+
"format": "uri",
|
|
10798
|
+
"description": "HTTPS endpoint URL."
|
|
10799
|
+
},
|
|
10800
|
+
"events": {
|
|
10801
|
+
"type": "array",
|
|
10802
|
+
"items": {
|
|
10803
|
+
"type": "string"
|
|
10804
|
+
},
|
|
10805
|
+
"description": "Event types to subscribe to."
|
|
10806
|
+
},
|
|
10807
|
+
"source_id": {
|
|
10808
|
+
"type": "string",
|
|
10809
|
+
"description": "Scope to a specific source (optional)."
|
|
10810
|
+
},
|
|
10811
|
+
"secret": {
|
|
10812
|
+
"type": "string",
|
|
10813
|
+
"description": "Signing secret. Auto-generated if omitted."
|
|
10814
|
+
}
|
|
10815
|
+
}
|
|
10816
|
+
}
|
|
10817
|
+
}
|
|
10818
|
+
}
|
|
10819
|
+
},
|
|
10820
|
+
"responses": {
|
|
10821
|
+
"201": {
|
|
10822
|
+
"description": "Webhook created. Returns the webhook config including the signing secret."
|
|
10823
|
+
},
|
|
10824
|
+
"400": {
|
|
10825
|
+
"description": "Invalid URL or event types."
|
|
10826
|
+
},
|
|
10827
|
+
"401": {
|
|
10828
|
+
"description": "Missing or invalid API key."
|
|
10829
|
+
}
|
|
10830
|
+
}
|
|
10831
|
+
}
|
|
10832
|
+
},
|
|
10833
|
+
"/v1/webhooks/{id}": {
|
|
10834
|
+
"get": {
|
|
10835
|
+
"operationId": "getWebhook",
|
|
10836
|
+
"summary": "Get webhook configuration",
|
|
10837
|
+
"tags": [
|
|
10838
|
+
"Delivery"
|
|
10839
|
+
],
|
|
10840
|
+
"parameters": [
|
|
10841
|
+
{
|
|
10842
|
+
"name": "id",
|
|
10843
|
+
"in": "path",
|
|
10844
|
+
"required": true,
|
|
10845
|
+
"schema": {
|
|
10846
|
+
"type": "string",
|
|
10847
|
+
"format": "uuid"
|
|
10848
|
+
}
|
|
10849
|
+
}
|
|
10850
|
+
],
|
|
10851
|
+
"responses": {
|
|
10852
|
+
"200": {
|
|
10853
|
+
"description": "Webhook configuration."
|
|
10854
|
+
},
|
|
10855
|
+
"404": {
|
|
10856
|
+
"description": "Webhook not found."
|
|
10857
|
+
}
|
|
10858
|
+
}
|
|
10859
|
+
},
|
|
10860
|
+
"patch": {
|
|
10861
|
+
"operationId": "updateWebhook",
|
|
10862
|
+
"summary": "Update webhook configuration",
|
|
10863
|
+
"tags": [
|
|
10864
|
+
"Delivery"
|
|
10865
|
+
],
|
|
10866
|
+
"parameters": [
|
|
10867
|
+
{
|
|
10868
|
+
"name": "id",
|
|
10869
|
+
"in": "path",
|
|
10870
|
+
"required": true,
|
|
10871
|
+
"schema": {
|
|
10872
|
+
"type": "string",
|
|
10873
|
+
"format": "uuid"
|
|
10874
|
+
}
|
|
10875
|
+
}
|
|
10876
|
+
],
|
|
10877
|
+
"requestBody": {
|
|
10878
|
+
"content": {
|
|
10879
|
+
"application/json": {
|
|
10880
|
+
"schema": {
|
|
10881
|
+
"type": "object",
|
|
10882
|
+
"properties": {
|
|
10883
|
+
"url": {
|
|
10884
|
+
"type": "string",
|
|
10885
|
+
"format": "uri"
|
|
10886
|
+
},
|
|
10887
|
+
"events": {
|
|
10888
|
+
"type": "array",
|
|
10889
|
+
"items": {
|
|
10890
|
+
"type": "string"
|
|
10891
|
+
}
|
|
10892
|
+
},
|
|
10893
|
+
"active": {
|
|
10894
|
+
"type": "boolean"
|
|
10895
|
+
}
|
|
10896
|
+
}
|
|
10897
|
+
}
|
|
10898
|
+
}
|
|
10899
|
+
}
|
|
10900
|
+
},
|
|
10901
|
+
"responses": {
|
|
10902
|
+
"200": {
|
|
10903
|
+
"description": "Webhook updated."
|
|
10904
|
+
},
|
|
10905
|
+
"404": {
|
|
10906
|
+
"description": "Webhook not found."
|
|
10907
|
+
}
|
|
10908
|
+
}
|
|
10909
|
+
},
|
|
10910
|
+
"delete": {
|
|
10911
|
+
"operationId": "deleteWebhook",
|
|
10912
|
+
"summary": "Delete webhook configuration",
|
|
10913
|
+
"tags": [
|
|
10914
|
+
"Delivery"
|
|
10915
|
+
],
|
|
10916
|
+
"parameters": [
|
|
10917
|
+
{
|
|
10918
|
+
"name": "id",
|
|
10919
|
+
"in": "path",
|
|
10920
|
+
"required": true,
|
|
10921
|
+
"schema": {
|
|
10922
|
+
"type": "string",
|
|
10923
|
+
"format": "uuid"
|
|
10924
|
+
}
|
|
10925
|
+
}
|
|
10926
|
+
],
|
|
10927
|
+
"responses": {
|
|
10928
|
+
"200": {
|
|
10929
|
+
"description": "Webhook deleted."
|
|
10930
|
+
},
|
|
10931
|
+
"404": {
|
|
10932
|
+
"description": "Webhook not found."
|
|
10933
|
+
}
|
|
10934
|
+
}
|
|
10935
|
+
}
|
|
10461
10936
|
}
|
|
10462
10937
|
},
|
|
10463
10938
|
"components": {
|
|
@@ -10490,7 +10965,7 @@
|
|
|
10490
10965
|
"maximum": 100,
|
|
10491
10966
|
"default": 20
|
|
10492
10967
|
},
|
|
10493
|
-
"description": "Maximum number of items to return (1
|
|
10968
|
+
"description": "Maximum number of items to return (1\u2013100)."
|
|
10494
10969
|
},
|
|
10495
10970
|
"Cursor": {
|
|
10496
10971
|
"name": "cursor",
|
|
@@ -10822,7 +11297,7 @@
|
|
|
10822
11297
|
},
|
|
10823
11298
|
"attempt": {
|
|
10824
11299
|
"type": "integer",
|
|
10825
|
-
"description": "Delivery attempt number (1
|
|
11300
|
+
"description": "Delivery attempt number (1\u20137).",
|
|
10826
11301
|
"example": 1
|
|
10827
11302
|
},
|
|
10828
11303
|
"delivered_at": {
|
|
@@ -11747,7 +12222,7 @@
|
|
|
11747
12222
|
"integer",
|
|
11748
12223
|
"null"
|
|
11749
12224
|
],
|
|
11750
|
-
"description": "Percentage complete (0
|
|
12225
|
+
"description": "Percentage complete (0\u2013100). Only present while `processing`.",
|
|
11751
12226
|
"example": 45
|
|
11752
12227
|
},
|
|
11753
12228
|
"estimated_seconds_remaining": {
|
|
@@ -12351,7 +12826,7 @@
|
|
|
12351
12826
|
},
|
|
12352
12827
|
"boolean_format": {
|
|
12353
12828
|
"type": "array",
|
|
12354
|
-
"description": "Exactly 2 strings
|
|
12829
|
+
"description": "Exactly 2 strings \u2014 `[true_value, false_value]`.",
|
|
12355
12830
|
"minItems": 2,
|
|
12356
12831
|
"maxItems": 2,
|
|
12357
12832
|
"items": {
|
|
@@ -12397,7 +12872,7 @@
|
|
|
12397
12872
|
},
|
|
12398
12873
|
"boolean_format": {
|
|
12399
12874
|
"type": "array",
|
|
12400
|
-
"description": "Exactly 2 strings
|
|
12875
|
+
"description": "Exactly 2 strings \u2014 `[true_value, false_value]`.",
|
|
12401
12876
|
"minItems": 2,
|
|
12402
12877
|
"maxItems": 2,
|
|
12403
12878
|
"items": {
|
|
@@ -12412,7 +12887,7 @@
|
|
|
12412
12887
|
},
|
|
12413
12888
|
"DialectUpdateRequest": {
|
|
12414
12889
|
"type": "object",
|
|
12415
|
-
"description": "Partial update
|
|
12890
|
+
"description": "Partial update \u2014 only supplied keys are patched.",
|
|
12416
12891
|
"properties": {
|
|
12417
12892
|
"name": {
|
|
12418
12893
|
"type": "string"
|
|
@@ -12444,7 +12919,7 @@
|
|
|
12444
12919
|
},
|
|
12445
12920
|
"MatchingFieldMapping": {
|
|
12446
12921
|
"type": "object",
|
|
12447
|
-
"description": "Field-mapping entry linking an extracted field to a reference-data column.\nThe shape below is illustrative
|
|
12922
|
+
"description": "Field-mapping entry linking an extracted field to a reference-data column.\nThe shape below is illustrative \u2014 the platform accepts any object shape and\napplies matching using the documented keys when present.\n",
|
|
12448
12923
|
"additionalProperties": true,
|
|
12449
12924
|
"properties": {
|
|
12450
12925
|
"extracted_field": {
|
|
@@ -12606,7 +13081,7 @@
|
|
|
12606
13081
|
},
|
|
12607
13082
|
"MatchingConfigUpdateRequest": {
|
|
12608
13083
|
"type": "object",
|
|
12609
|
-
"description": "Partial update
|
|
13084
|
+
"description": "Partial update \u2014 only provided keys are applied.",
|
|
12610
13085
|
"properties": {
|
|
12611
13086
|
"name": {
|
|
12612
13087
|
"type": "string"
|
|
@@ -12913,7 +13388,7 @@
|
|
|
12913
13388
|
},
|
|
12914
13389
|
"RoutingRuleUpdateRequest": {
|
|
12915
13390
|
"type": "object",
|
|
12916
|
-
"description": "Partial update
|
|
13391
|
+
"description": "Partial update \u2014 only supplied keys are patched.",
|
|
12917
13392
|
"properties": {
|
|
12918
13393
|
"name": {
|
|
12919
13394
|
"type": "string"
|
|
@@ -12967,7 +13442,7 @@
|
|
|
12967
13442
|
},
|
|
12968
13443
|
"type": {
|
|
12969
13444
|
"type": "string",
|
|
12970
|
-
"description": "Connector type discriminant
|
|
13445
|
+
"description": "Connector type discriminant \u2014 resolves to a registered connector. Live types are `webhook`, `sftp`, `s3`, `azure_blob`, `google_drive`, `onedrive`, `google_sheets`.",
|
|
12971
13446
|
"example": "webhook"
|
|
12972
13447
|
},
|
|
12973
13448
|
"config": {
|
|
@@ -13063,7 +13538,7 @@
|
|
|
13063
13538
|
},
|
|
13064
13539
|
"UpdateDestinationRequest": {
|
|
13065
13540
|
"type": "object",
|
|
13066
|
-
"description": "Partial update
|
|
13541
|
+
"description": "Partial update \u2014 every field optional. Only supplied fields are written.",
|
|
13067
13542
|
"properties": {
|
|
13068
13543
|
"name": {
|
|
13069
13544
|
"type": "string"
|
|
@@ -13161,7 +13636,7 @@
|
|
|
13161
13636
|
},
|
|
13162
13637
|
"FieldMap": {
|
|
13163
13638
|
"type": "object",
|
|
13164
|
-
"description": "Declarative projection applied between resolver output and serializer\ninput. Operations run in fixed order: drop
|
|
13639
|
+
"description": "Declarative projection applied between resolver output and serializer\ninput. Operations run in fixed order: drop \u2192 rename \u2192 static.\n",
|
|
13165
13640
|
"properties": {
|
|
13166
13641
|
"rules": {
|
|
13167
13642
|
"type": "array",
|
|
@@ -13184,7 +13659,7 @@
|
|
|
13184
13659
|
"static": {
|
|
13185
13660
|
"type": "object",
|
|
13186
13661
|
"additionalProperties": true,
|
|
13187
|
-
"description": "Literal key/value pairs added last
|
|
13662
|
+
"description": "Literal key/value pairs added last \u2014 always wins collisions."
|
|
13188
13663
|
},
|
|
13189
13664
|
"drop": {
|
|
13190
13665
|
"type": "array",
|
|
@@ -13344,7 +13819,7 @@
|
|
|
13344
13819
|
},
|
|
13345
13820
|
"UpdateBindingRequest": {
|
|
13346
13821
|
"type": "object",
|
|
13347
|
-
"description": "Partial update
|
|
13822
|
+
"description": "Partial update \u2014 every field optional.",
|
|
13348
13823
|
"properties": {
|
|
13349
13824
|
"name": {
|
|
13350
13825
|
"type": "string"
|
|
@@ -13518,7 +13993,7 @@
|
|
|
13518
13993
|
],
|
|
13519
13994
|
"format": "uuid",
|
|
13520
13995
|
"example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
|
13521
|
-
"description": "FK to the last DeliveryItem attempt (nullable
|
|
13996
|
+
"description": "FK to the last DeliveryItem attempt (nullable \u2014 `ON DELETE SET NULL`)."
|
|
13522
13997
|
},
|
|
13523
13998
|
"error_code": {
|
|
13524
13999
|
"type": "string",
|
|
@@ -13550,7 +14025,7 @@
|
|
|
13550
14025
|
"created_at",
|
|
13551
14026
|
"processing_attempts"
|
|
13552
14027
|
],
|
|
13553
|
-
"description": "Outbox record (not the typed producer DTO). Represents a single row in\nthe `delivery_events` table. `event_type` is a string discriminant
|
|
14028
|
+
"description": "Outbox record (not the typed producer DTO). Represents a single row in\nthe `delivery_events` table. `event_type` is a string discriminant \u2014\nsee `/v1/delivery/catalog/signals` for the exhaustive list.\n",
|
|
13554
14029
|
"properties": {
|
|
13555
14030
|
"id": {
|
|
13556
14031
|
"type": "string",
|
|
@@ -13567,7 +14042,7 @@
|
|
|
13567
14042
|
"payload": {
|
|
13568
14043
|
"type": "object",
|
|
13569
14044
|
"additionalProperties": true,
|
|
13570
|
-
"description": "Entity IDs only
|
|
14045
|
+
"description": "Entity IDs only \u2014 deliverable resolvers load content at delivery time."
|
|
13571
14046
|
},
|
|
13572
14047
|
"dedup_key": {
|
|
13573
14048
|
"type": [
|
|
@@ -13635,7 +14110,7 @@
|
|
|
13635
14110
|
"items": {
|
|
13636
14111
|
"type": "string"
|
|
13637
14112
|
},
|
|
13638
|
-
"description": "Empty for slice-2 stub resolvers
|
|
14113
|
+
"description": "Empty for slice-2 stub resolvers \u2014 they appear in the list but never route."
|
|
13639
14114
|
},
|
|
13640
14115
|
"shape": {
|
|
13641
14116
|
"oneOf": [
|
|
@@ -13776,7 +14251,7 @@
|
|
|
13776
14251
|
},
|
|
13777
14252
|
"supports_kinds": {
|
|
13778
14253
|
"type": "array",
|
|
13779
|
-
"description": "Deliverable shape kinds this serializer accepts. Probed against a\nminimal synthetic shape per kind
|
|
14254
|
+
"description": "Deliverable shape kinds this serializer accepts. Probed against a\nminimal synthetic shape per kind \u2014 always reflects the current\nimplementation.\n",
|
|
13780
14255
|
"items": {
|
|
13781
14256
|
"type": "string",
|
|
13782
14257
|
"enum": [
|
|
@@ -13858,7 +14333,7 @@
|
|
|
13858
14333
|
"serialized",
|
|
13859
14334
|
"wire_preview"
|
|
13860
14335
|
],
|
|
13861
|
-
"description": "Output of `POST /v1/delivery/bindings/{id}/preview`. When the resolver\nsuccessfully loads a synthetic entity the full pipeline (`resolve
|
|
14336
|
+
"description": "Output of `POST /v1/delivery/bindings/{id}/preview`. When the resolver\nsuccessfully loads a synthetic entity the full pipeline (`resolve \u2192\nprojectFieldMap \u2192 serialize`) runs and `sample_mode=\"real\"`. When the\nresolver throws (commonly `EntityMissingError` on a synthetic id) the\nservice falls back to `sample_mode=\"structural\"` and returns only the\nresolver's declared shape \u2014 `projected`, `serialized`, and\n`wire_preview` are `null` in that case.\n",
|
|
13862
14337
|
"properties": {
|
|
13863
14338
|
"available": {
|
|
13864
14339
|
"type": "boolean",
|
|
@@ -13873,7 +14348,7 @@
|
|
|
13873
14348
|
"real",
|
|
13874
14349
|
"structural"
|
|
13875
14350
|
],
|
|
13876
|
-
"description": "`real`
|
|
14351
|
+
"description": "`real` \u2014 the resolver loaded a synthetic entity and every pipeline\nstage ran. `structural` \u2014 the resolver threw (typically\n`entity_missing`) so only the declared shape is returned.\n"
|
|
13877
14352
|
},
|
|
13878
14353
|
"signal": {
|
|
13879
14354
|
"type": "object",
|
|
@@ -14033,7 +14508,7 @@
|
|
|
14033
14508
|
"additionalProperties": {
|
|
14034
14509
|
"type": "string"
|
|
14035
14510
|
},
|
|
14036
|
-
"description": "The `X-Talonic-*` headers that would ship on the wire. The\n`X-Talonic-Signature` header, when present, is rendered as\n`t=<preview>,v1=<preview>`
|
|
14511
|
+
"description": "The `X-Talonic-*` headers that would ship on the wire. The\n`X-Talonic-Signature` header, when present, is rendered as\n`t=<preview>,v1=<preview>` \u2014 the preview never computes a real\nHMAC so the signing secret is not exercised.\n"
|
|
14037
14512
|
}
|
|
14038
14513
|
}
|
|
14039
14514
|
},
|
|
@@ -14144,7 +14619,7 @@
|
|
|
14144
14619
|
}
|
|
14145
14620
|
},
|
|
14146
14621
|
"DestinationAuthConfig": {
|
|
14147
|
-
"description": "Destination credential payload. Write-only
|
|
14622
|
+
"description": "Destination credential payload. Write-only \u2014 server responses expose\nonly `has_auth_config: boolean`, never the credential values\nthemselves. The `type` field discriminates the concrete shape; valid\nvalues depend on the parent destination's connector `type` (see\n`/v1/delivery/catalog/connectors` for each connector's `auth_types`).\n",
|
|
14148
14623
|
"oneOf": [
|
|
14149
14624
|
{
|
|
14150
14625
|
"$ref": "#/components/schemas/AuthConfigPassword"
|
|
@@ -14392,7 +14867,7 @@
|
|
|
14392
14867
|
},
|
|
14393
14868
|
"operator": {
|
|
14394
14869
|
"type": "string",
|
|
14395
|
-
"description": "Operator identifier (free-form
|
|
14870
|
+
"description": "Operator identifier (free-form \u2014 e.g. `eq`, `contains`, `between`).",
|
|
14396
14871
|
"example": "between"
|
|
14397
14872
|
},
|
|
14398
14873
|
"value": {
|