@talonic/docs 0.6.2 → 0.8.0

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/index.js CHANGED
@@ -591,14 +591,21 @@ var NAV_SECTIONS = [
591
591
  ]
592
592
  },
593
593
  {
594
- id: "exports",
595
- label: "Exports",
594
+ id: "delivery",
595
+ label: "Delivery",
596
596
  children: [
597
+ { id: "delivery-overview", label: "Overview" },
597
598
  { id: "list-destinations", label: "List Destinations" },
598
599
  { id: "create-destination", label: "Create Destination" },
599
- { id: "manage-destination", label: "Get / Delete Destination" },
600
- { id: "list-triggers", label: "List Triggers" },
601
- { id: "create-trigger", label: "Create Trigger" }
600
+ { id: "manage-destination", label: "Get / Update / Delete" },
601
+ { id: "test-destination", label: "Test Destination" },
602
+ { id: "list-bindings", label: "List Bindings" },
603
+ { id: "create-binding", label: "Create Binding" },
604
+ { id: "manage-binding", label: "Get / Update / Delete" },
605
+ { id: "delivery-items", label: "Items (History)" },
606
+ { id: "delivery-dlq", label: "Dead-Letter Queue" },
607
+ { id: "delivery-events", label: "Outbox Events" },
608
+ { id: "delivery-catalog", label: "Catalog" }
602
609
  ]
603
610
  },
604
611
  {
@@ -2283,7 +2290,7 @@ function ApiReference({ LinkComponent }) {
2283
2290
  }
2284
2291
  ) }),
2285
2292
  /* @__PURE__ */ jsx5(SectionHeading, { id: "routing", children: "Routing Rules" }),
2286
- /* @__PURE__ */ jsx5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-6", children: "Routing rules automatically direct documents to schemas, reviewers, or export destinations based on configurable conditions." }),
2293
+ /* @__PURE__ */ jsx5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-6", children: "Routing rules automatically direct documents to schemas, reviewers, or delivery destinations based on configurable conditions." }),
2287
2294
  /* @__PURE__ */ jsx5("div", { id: "list-routing-rules", className: "scroll-mt-6", children: /* @__PURE__ */ jsx5(
2288
2295
  EndpointBlock,
2289
2296
  {
@@ -2342,108 +2349,250 @@ function ApiReference({ LinkComponent }) {
2342
2349
  /* @__PURE__ */ jsx5(EndpointBlock, { method: "DELETE", path: "/v1/routing-rules/:id", summary: "Delete a routing rule." })
2343
2350
  ] })
2344
2351
  ] }),
2345
- /* @__PURE__ */ jsx5(SectionHeading, { id: "exports", children: "Exports" }),
2346
- /* @__PURE__ */ jsx5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-6", children: "Configure export destinations (S3, webhook, SFTP) and triggers that automatically push structured data when conditions are met." }),
2352
+ /* @__PURE__ */ jsx5(SectionHeading, { id: "delivery", children: "Delivery" }),
2353
+ /* @__PURE__ */ jsxs5("div", { id: "delivery-overview", className: "scroll-mt-6", children: [
2354
+ /* @__PURE__ */ jsxs5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-4", children: [
2355
+ "Configure outbound delivery. Emit signals (",
2356
+ /* @__PURE__ */ jsx5(InlineCode, { children: "document.extracted" }),
2357
+ ",",
2358
+ " ",
2359
+ /* @__PURE__ */ jsx5(InlineCode, { children: "run.dataspace.completed" }),
2360
+ ", ",
2361
+ /* @__PURE__ */ jsx5(InlineCode, { children: "result.approved" }),
2362
+ ", \u2026) are routed through ",
2363
+ /* @__PURE__ */ jsx5("strong", { children: "bindings" }),
2364
+ " that join a signal filter to a",
2365
+ " ",
2366
+ /* @__PURE__ */ jsx5("strong", { children: "deliverable resolver" }),
2367
+ ", a ",
2368
+ /* @__PURE__ */ jsx5("strong", { children: "serializer" }),
2369
+ ", and a",
2370
+ " ",
2371
+ /* @__PURE__ */ jsx5("strong", { children: "destination" }),
2372
+ ". Slice-1 ships the ",
2373
+ /* @__PURE__ */ jsx5(InlineCode, { children: "webhook" }),
2374
+ " ",
2375
+ "connector with HMAC-signed payloads, idempotency keys, SSRF guard, payload caps, and a fixed retry ladder; S3, SFTP, Sheets, Drive, and Email arrive in later slices."
2376
+ ] }),
2377
+ /* @__PURE__ */ jsxs5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-6", children: [
2378
+ "Every attempt is recorded in the history log (",
2379
+ /* @__PURE__ */ jsx5(InlineCode, { children: "/v1/delivery/items" }),
2380
+ "). Terminal failures land in the dead-letter queue (",
2381
+ /* @__PURE__ */ jsx5(InlineCode, { children: "/v1/delivery/dlq" }),
2382
+ ") and are replayable. The raw outbox is inspectable at",
2383
+ " ",
2384
+ /* @__PURE__ */ jsx5(InlineCode, { children: "/v1/delivery/events" }),
2385
+ ". Use",
2386
+ " ",
2387
+ /* @__PURE__ */ jsx5(InlineCode, { children: "/v1/delivery/catalog/*" }),
2388
+ " to discover available signals, deliverables, serializers, and connectors \u2014 the catalog drives the compatibility-triangle validator that runs on every binding create/update."
2389
+ ] })
2390
+ ] }),
2347
2391
  /* @__PURE__ */ jsx5("div", { id: "list-destinations", className: "scroll-mt-6", children: /* @__PURE__ */ jsx5(
2348
2392
  EndpointBlock,
2349
2393
  {
2350
2394
  method: "GET",
2351
- path: "/v1/exports/destinations",
2352
- summary: "List all configured export destinations.",
2353
- children: /* @__PURE__ */ jsx5(CodeBlock, { title: "Response", children: `{
2354
- "data": [
2355
- {
2356
- "id": "dest_9x2k4m",
2357
- "name": "Production S3",
2358
- "type": "s3",
2359
- "config": { "bucket": "my-exports", "prefix": "structured/" },
2360
- "created_at": "2024-09-01T00:00:00Z"
2361
- }
2362
- ]
2363
- }` })
2395
+ path: "/v1/delivery/destinations",
2396
+ summary: "List delivery destinations.",
2397
+ children: /* @__PURE__ */ jsx5(CodeBlock, { title: "Response", children: `[
2398
+ {
2399
+ "id": "7f8a2b44-...",
2400
+ "name": "Analytics webhook",
2401
+ "type": "webhook",
2402
+ "config": { "url": "https://example.com/hook", "headers": {} },
2403
+ "signing_secret": "***",
2404
+ "payload_cap_bytes": null,
2405
+ "is_active": true,
2406
+ "last_delivery_at": "2026-04-23T10:21:00Z",
2407
+ "last_delivery_status": "succeeded",
2408
+ "created_at": "2026-04-15T00:00:00Z",
2409
+ "updated_at": "2026-04-23T10:21:00Z"
2410
+ }
2411
+ ]` })
2364
2412
  }
2365
2413
  ) }),
2366
2414
  /* @__PURE__ */ jsx5("div", { id: "create-destination", className: "scroll-mt-6", children: /* @__PURE__ */ jsxs5(
2367
2415
  EndpointBlock,
2368
2416
  {
2369
2417
  method: "POST",
2370
- path: "/v1/exports/destinations",
2371
- summary: "Create a new export destination.",
2418
+ path: "/v1/delivery/destinations",
2419
+ summary: "Create a delivery destination.",
2372
2420
  children: [
2373
2421
  /* @__PURE__ */ jsx5(
2374
2422
  ParamTable,
2375
2423
  {
2376
2424
  title: "Body parameters",
2377
2425
  params: [
2378
- { name: "name", type: "string", required: true, description: "Destination name." },
2379
- { name: "type", type: "string", required: true, description: "Type: s3, webhook, sftp." },
2380
- { name: "config", type: "object", required: true, description: "Type-specific configuration (bucket, url, host, etc.)." }
2426
+ { name: "name", type: "string", required: true, description: "Human-readable name." },
2427
+ { name: "type", type: "string", required: true, description: "Connector type. Slice-1 ships `webhook`." },
2428
+ { name: "config", type: "object", description: "Connector-specific configuration (e.g. `{ url, headers }`)." },
2429
+ { name: "auth_config", type: "object", description: "Connector-specific credentials. Never echoed back in full." },
2430
+ { name: "signing_secret", type: "string", description: "HMAC secret for connectors that sign outbound bodies." },
2431
+ { name: "payload_cap_bytes", type: "integer", description: "Per-destination TransportWrapper cap override." },
2432
+ { name: "is_active", type: "boolean", description: "Defaults to true." }
2381
2433
  ]
2382
2434
  }
2383
2435
  ),
2384
2436
  /* @__PURE__ */ jsx5(CodeBlock, { title: "Response (201)", children: `{
2385
- "id": "dest_9x2k4m",
2386
- "name": "Production S3",
2387
- "type": "s3",
2388
- "config": { "bucket": "my-exports", "prefix": "structured/" }
2437
+ "id": "7f8a2b44-...",
2438
+ "name": "Analytics webhook",
2439
+ "type": "webhook",
2440
+ "config": { "url": "https://example.com/hook" },
2441
+ "signing_secret": "***",
2442
+ "is_active": true,
2443
+ "created_at": "2026-04-23T10:21:00Z",
2444
+ "updated_at": "2026-04-23T10:21:00Z"
2389
2445
  }` })
2390
2446
  ]
2391
2447
  }
2392
2448
  ) }),
2393
2449
  /* @__PURE__ */ jsxs5("div", { id: "manage-destination", className: "scroll-mt-6", children: [
2394
- /* @__PURE__ */ jsx5(SubHeading, { id: "manage-destination", children: "Get / Delete Destination" }),
2450
+ /* @__PURE__ */ jsx5(SubHeading, { id: "manage-destination", children: "Get / Update / Delete Destination" }),
2395
2451
  /* @__PURE__ */ jsxs5("div", { className: "space-y-2 mb-6", children: [
2396
- /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/exports/destinations/:id", summary: "Get destination details." }),
2397
- /* @__PURE__ */ jsx5(EndpointBlock, { method: "DELETE", path: "/v1/exports/destinations/:id", summary: "Delete a destination and its triggers." })
2452
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/delivery/destinations/:id", summary: "Get destination detail." }),
2453
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "PUT", path: "/v1/delivery/destinations/:id", summary: "Partial update \u2014 only supplied fields are written." }),
2454
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "DELETE", path: "/v1/delivery/destinations/:id", summary: "Delete a destination. Cascading bindings are removed." })
2398
2455
  ] })
2399
2456
  ] }),
2400
- /* @__PURE__ */ jsx5("div", { id: "list-triggers", className: "scroll-mt-6", children: /* @__PURE__ */ jsx5(
2457
+ /* @__PURE__ */ jsx5("div", { id: "test-destination", className: "scroll-mt-6", children: /* @__PURE__ */ jsxs5(
2401
2458
  EndpointBlock,
2402
2459
  {
2403
- method: "GET",
2404
- path: "/v1/exports/triggers",
2405
- summary: "List all export triggers.",
2406
- children: /* @__PURE__ */ jsx5(CodeBlock, { title: "Response", children: `{
2407
- "data": [
2408
- {
2409
- "id": "trig_3n7k9m",
2410
- "name": "On extraction complete",
2411
- "destination_id": "dest_9x2k4m",
2412
- "event": "extraction.completed",
2413
- "conditions": { "schema_id": "schema_fin_001" }
2414
- }
2415
- ]
2460
+ method: "POST",
2461
+ path: "/v1/delivery/destinations/:id/test",
2462
+ summary: "Live-ping a destination through the full transport envelope.",
2463
+ children: [
2464
+ /* @__PURE__ */ jsxs5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-4", children: [
2465
+ "Exercises the complete delivery envelope (SSRF guard, payload cap, rate limit \u2014 retry ladder is disabled, ",
2466
+ /* @__PURE__ */ jsx5(InlineCode, { children: "max_attempts: 1" }),
2467
+ ") with a tiny test payload."
2468
+ ] }),
2469
+ /* @__PURE__ */ jsx5(CodeBlock, { title: "Response", children: `{
2470
+ "success": true,
2471
+ "httpStatus": 200,
2472
+ "durationMs": 284,
2473
+ "message": null
2416
2474
  }` })
2475
+ ]
2417
2476
  }
2418
2477
  ) }),
2419
- /* @__PURE__ */ jsx5("div", { id: "create-trigger", className: "scroll-mt-6", children: /* @__PURE__ */ jsxs5(
2478
+ /* @__PURE__ */ jsx5("div", { id: "list-bindings", className: "scroll-mt-6", children: /* @__PURE__ */ jsx5(
2479
+ EndpointBlock,
2480
+ {
2481
+ method: "GET",
2482
+ path: "/v1/delivery/bindings",
2483
+ summary: "List delivery bindings.",
2484
+ children: /* @__PURE__ */ jsx5(CodeBlock, { title: "Response", children: `[
2485
+ {
2486
+ "id": "4c2e1a39-...",
2487
+ "name": "Extracted docs -> analytics",
2488
+ "signal_filter": { "event_type": "document.extracted" },
2489
+ "deliverable_type": "document_meta",
2490
+ "destination_id": "7f8a2b44-...",
2491
+ "serializer_format": "json",
2492
+ "is_active": true
2493
+ }
2494
+ ]` })
2495
+ }
2496
+ ) }),
2497
+ /* @__PURE__ */ jsx5("div", { id: "create-binding", className: "scroll-mt-6", children: /* @__PURE__ */ jsxs5(
2420
2498
  EndpointBlock,
2421
2499
  {
2422
2500
  method: "POST",
2423
- path: "/v1/exports/triggers",
2424
- summary: "Create a new export trigger.",
2501
+ path: "/v1/delivery/bindings",
2502
+ summary: "Create a delivery binding.",
2425
2503
  children: [
2504
+ /* @__PURE__ */ jsxs5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-4", children: [
2505
+ "Runs the compatibility-triangle validator: the ",
2506
+ /* @__PURE__ */ jsx5(InlineCode, { children: "signal_filter" }),
2507
+ " must be well-formed, the ",
2508
+ /* @__PURE__ */ jsx5(InlineCode, { children: "deliverable_type" }),
2509
+ " must resolve to a registered resolver, the ",
2510
+ /* @__PURE__ */ jsx5(InlineCode, { children: "serializer_format" }),
2511
+ " must resolve to a registered serializer, and the serializer must support the resolver's shape."
2512
+ ] }),
2426
2513
  /* @__PURE__ */ jsx5(
2427
2514
  ParamTable,
2428
2515
  {
2429
2516
  title: "Body parameters",
2430
2517
  params: [
2431
- { name: "name", type: "string", required: true, description: "Trigger name." },
2432
- { name: "destination_id", type: "string", required: true, description: "Target destination." },
2433
- { name: "event", type: "string", required: true, description: "Event type: extraction.completed, job.completed." },
2434
- { name: "conditions", type: "object", description: "Optional conditions to filter events." }
2518
+ { name: "name", type: "string", required: true, description: "Human-readable name." },
2519
+ { name: "signal_filter", type: "object", required: true, description: "Shape: `{ event_type, match? }`. Match is an equality filter on payload keys." },
2520
+ { name: "deliverable_type", type: "string", required: true, description: "Registered resolver (`/v1/delivery/catalog/deliverables`)." },
2521
+ { name: "destination_id", type: "uuid", required: true, description: "Destination to deliver to." },
2522
+ { name: "serializer_format", type: "string", required: true, description: "One of `json`, `ndjson`, `csv`, `csv_file`, `xlsx`, `rows`, `graph`, `raw`, `md`, `txt`." },
2523
+ { name: "serializer_config", type: "object", description: "Format-specific options (delimiter, include_header, etc.)." },
2524
+ { name: "field_map", type: "object", description: "Declarative projection: `{ rules, static, drop }`. Drop \u2192 rename \u2192 static in fixed order." },
2525
+ { name: "delivery_policy", type: "object", description: "Retry/timeout overrides. Defaults to 6 attempts, `[5s, 30s, 2min, 10min, 1h]`." },
2526
+ { name: "is_active", type: "boolean", description: "Defaults to true." }
2435
2527
  ]
2436
2528
  }
2437
- ),
2438
- /* @__PURE__ */ jsx5(CodeBlock, { title: "Response (201)", children: `{
2439
- "id": "trig_3n7k9m",
2440
- "name": "On extraction complete",
2441
- "destination_id": "dest_9x2k4m",
2442
- "event": "extraction.completed"
2443
- }` })
2529
+ )
2444
2530
  ]
2445
2531
  }
2446
2532
  ) }),
2533
+ /* @__PURE__ */ jsxs5("div", { id: "manage-binding", className: "scroll-mt-6", children: [
2534
+ /* @__PURE__ */ jsx5(SubHeading, { id: "manage-binding", children: "Get / Update / Delete Binding" }),
2535
+ /* @__PURE__ */ jsxs5("div", { className: "space-y-2 mb-6", children: [
2536
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/delivery/bindings/:id", summary: "Get binding detail." }),
2537
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "PUT", path: "/v1/delivery/bindings/:id", summary: "Partial update. Re-runs the compatibility-triangle validator on changed fields." }),
2538
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "DELETE", path: "/v1/delivery/bindings/:id", summary: "Delete a binding." }),
2539
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "POST", path: "/v1/delivery/bindings/:id/preview", summary: "Synthetic-signal dry run. Stubbed in slice 1." })
2540
+ ] })
2541
+ ] }),
2542
+ /* @__PURE__ */ jsxs5("div", { id: "delivery-items", className: "scroll-mt-6", children: [
2543
+ /* @__PURE__ */ jsx5(SubHeading, { id: "delivery-items", children: "Items (History)" }),
2544
+ /* @__PURE__ */ jsxs5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-4", children: [
2545
+ "One row per delivery attempt. The processor writes ",
2546
+ /* @__PURE__ */ jsx5(InlineCode, { children: "in_flight" }),
2547
+ " at start, then updates to ",
2548
+ /* @__PURE__ */ jsx5(InlineCode, { children: "succeeded" }),
2549
+ " or ",
2550
+ /* @__PURE__ */ jsx5(InlineCode, { children: "failed" }),
2551
+ ". Replay generates a new attempt with a new idempotency key \u2014 history is append-only."
2552
+ ] }),
2553
+ /* @__PURE__ */ jsxs5("div", { className: "space-y-2 mb-6", children: [
2554
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/delivery/items", summary: "List attempts. Filter by binding_id, destination_id, status. Paginated." }),
2555
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/delivery/items/:id", summary: "Attempt detail with request/response bodies." }),
2556
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "POST", path: "/v1/delivery/items/:id/replay", summary: "Re-enqueue. Returns `{ enqueued, idempotency_key }`." })
2557
+ ] })
2558
+ ] }),
2559
+ /* @__PURE__ */ jsxs5("div", { id: "delivery-dlq", className: "scroll-mt-6", children: [
2560
+ /* @__PURE__ */ jsx5(SubHeading, { id: "delivery-dlq", children: "Dead-Letter Queue" }),
2561
+ /* @__PURE__ */ jsx5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-4", children: "Terminal failures after retry exhaustion (or permanent 4xx errors) land here. Replay enqueues a fresh attempt; dismiss removes the row from the queue without replaying." }),
2562
+ /* @__PURE__ */ jsxs5("div", { className: "space-y-2 mb-6", children: [
2563
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/delivery/dlq", summary: "List dead-letter rows. Filter by binding_id, error_code." }),
2564
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/delivery/dlq/:id", summary: "Dead-letter detail." }),
2565
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "POST", path: "/v1/delivery/dlq/:id/replay", summary: "Re-enqueue a dead-letter row. Row remains in queue for audit." }),
2566
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "DELETE", path: "/v1/delivery/dlq/:id", summary: "Dismiss the row." })
2567
+ ] })
2568
+ ] }),
2569
+ /* @__PURE__ */ jsxs5("div", { id: "delivery-events", className: "scroll-mt-6", children: [
2570
+ /* @__PURE__ */ jsx5(SubHeading, { id: "delivery-events", children: "Outbox Events" }),
2571
+ /* @__PURE__ */ jsxs5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-4", children: [
2572
+ "Raw outbox rows with their processing status (",
2573
+ /* @__PURE__ */ jsx5(InlineCode, { children: "enqueued" }),
2574
+ ",",
2575
+ " ",
2576
+ /* @__PURE__ */ jsx5(InlineCode, { children: "no-subscribers" }),
2577
+ ", ",
2578
+ /* @__PURE__ */ jsx5(InlineCode, { children: "failed" }),
2579
+ "). Useful for debugging binding matchers. Event IDs are BIGSERIAL (strings)."
2580
+ ] }),
2581
+ /* @__PURE__ */ jsxs5("div", { className: "space-y-2 mb-6", children: [
2582
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/delivery/events", summary: "List outbox rows. Filter by event_type. Paginated." }),
2583
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "POST", path: "/v1/delivery/events/:id/replay", summary: "Clear processed_at/processing_status so the poller re-picks the row." })
2584
+ ] })
2585
+ ] }),
2586
+ /* @__PURE__ */ jsxs5("div", { id: "delivery-catalog", className: "scroll-mt-6", children: [
2587
+ /* @__PURE__ */ jsx5(SubHeading, { id: "delivery-catalog", children: "Catalog" }),
2588
+ /* @__PURE__ */ jsx5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-4", children: "Introspect the four registries that drive the binding compatibility-triangle. Populate your binding-editor dropdowns from these endpoints rather than hardcoding lists." }),
2589
+ /* @__PURE__ */ jsxs5("div", { className: "space-y-2 mb-6", children: [
2590
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/delivery/catalog/signals", summary: "All DeliveryEventType discriminants." }),
2591
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/delivery/catalog/deliverables", summary: "Registered resolvers with compatible_signals and shape." }),
2592
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/delivery/catalog/serializers", summary: "Registered serializers with supports_kinds (probed)." }),
2593
+ /* @__PURE__ */ jsx5(EndpointBlock, { method: "GET", path: "/v1/delivery/catalog/connectors", summary: "Registered connectors with capabilities()." })
2594
+ ] })
2595
+ ] }),
2447
2596
  /* @__PURE__ */ jsx5(SectionHeading, { id: "review", children: "Review" }),
2448
2597
  /* @__PURE__ */ jsx5("p", { className: "text-[15px] text-void-text-secondary leading-relaxed mb-6", children: "The review queue surfaces extraction results that need human validation. Approve, reject, or batch-process items programmatically." }),
2449
2598
  /* @__PURE__ */ jsx5("div", { id: "list-review", className: "scroll-mt-6", children: /* @__PURE__ */ jsxs5(
@@ -3363,17 +3512,19 @@ var NAV_SECTIONS2 = [
3363
3512
  label: "Validation & Quality",
3364
3513
  children: [
3365
3514
  { id: "validation-checks", label: "Validation Checks" },
3366
- { id: "golden-samples", label: "Golden Samples" },
3515
+ { id: "ground-truth", label: "Golden Samples" },
3367
3516
  { id: "approval-gates", label: "Approval Gates" }
3368
3517
  ]
3369
3518
  },
3370
3519
  {
3371
3520
  id: "delivery",
3372
- label: "Outputs",
3521
+ label: "Delivery",
3373
3522
  children: [
3523
+ { id: "delivery-pipeline", label: "How Delivery Works" },
3374
3524
  { id: "destinations", label: "Destinations" },
3375
- { id: "field-mappings", label: "Field Mappings" },
3376
- { id: "export-triggers", label: "Triggers" }
3525
+ { id: "bindings", label: "Bindings" },
3526
+ { id: "signals-catalog", label: "Signals & Catalog" },
3527
+ { id: "delivery-history", label: "History & DLQ" }
3377
3528
  ]
3378
3529
  },
3379
3530
  {
@@ -3500,7 +3651,7 @@ function PlatformGuide({ LinkComponent }) {
3500
3651
  /* @__PURE__ */ jsx6(PipelineStage, { label: "Quality", state: "pending" })
3501
3652
  ] }) }),
3502
3653
  /* @__PURE__ */ jsx6("div", { className: "my-6 space-y-2", children: [
3503
- { n: "1", label: "Upload", desc: "Drag files or folders into Inputs. 25+ formats supported. ZIP archives are unpacked automatically." },
3654
+ { n: "1", label: "Upload", desc: "Drag files or folders into Sources. 25+ formats supported. ZIP archives are unpacked automatically." },
3504
3655
  { n: "2", label: "Extract", desc: "Each document is processed through Document AI (OCR + annotation), classified against the document type ontology, and sent to AI for exhaustive field extraction." },
3505
3656
  { n: "3", label: "Graph builds", desc: "Extracted fields resolve into the Field Registry \u2014 canonical names, clusters, master instructions." },
3506
3657
  { n: "4", label: "Define schema", desc: "Create a template with the fields you need. Map to registry, add reference tables." },
@@ -3517,7 +3668,7 @@ function PlatformGuide({ LinkComponent }) {
3517
3668
  /* @__PURE__ */ jsx6(SubHeading, { id: "getting-started", children: "Getting Started" }),
3518
3669
  /* @__PURE__ */ jsxs6(P, { children: [
3519
3670
  "Navigate using the sidebar. The platform is organized into three primary sections:",
3520
- /* @__PURE__ */ jsx6("strong", { children: " Inputs" }),
3671
+ /* @__PURE__ */ jsx6("strong", { children: " Sources" }),
3521
3672
  " (ingest), ",
3522
3673
  /* @__PURE__ */ jsx6("strong", { children: "Structuring" }),
3523
3674
  " (process & validate), and ",
@@ -3526,7 +3677,7 @@ function PlatformGuide({ LinkComponent }) {
3526
3677
  ] }),
3527
3678
  /* @__PURE__ */ jsx6(UiExcerpt, { title: "Sidebar Navigation", caption: "The sidebar provides access to all sections. Click the collapse button to save space. Press Cmd+K for global search.", children: /* @__PURE__ */ jsxs6("div", { className: "w-48 border border-void-border rounded-lg bg-void-bg p-3 space-y-0.5", children: [
3528
3679
  /* @__PURE__ */ jsx6(MockNavItem, { label: "Dashboard" }),
3529
- /* @__PURE__ */ jsx6(MockNavItem, { label: "Inputs", active: true }),
3680
+ /* @__PURE__ */ jsx6(MockNavItem, { label: "Sources", active: true }),
3530
3681
  /* @__PURE__ */ jsx6(MockNavItem, { label: "Documents", indent: true }),
3531
3682
  /* @__PURE__ */ jsx6(MockNavItem, { label: "Field Library", indent: true }),
3532
3683
  /* @__PURE__ */ jsx6(MockNavItem, { label: "Structuring" }),
@@ -3538,21 +3689,21 @@ function PlatformGuide({ LinkComponent }) {
3538
3689
  ] }) }),
3539
3690
  /* @__PURE__ */ jsxs6(Callout, { children: [
3540
3691
  "The fastest path to results: upload documents in ",
3541
- /* @__PURE__ */ jsx6("strong", { children: "Inputs" }),
3692
+ /* @__PURE__ */ jsx6("strong", { children: "Sources" }),
3542
3693
  ", then go to",
3543
3694
  " ",
3544
3695
  /* @__PURE__ */ jsx6("strong", { children: "Structuring \u2192 Runs \u2192 New" }),
3545
3696
  " to create your first extraction job."
3546
3697
  ] }),
3547
3698
  /* @__PURE__ */ jsx6(SectionHeading, { id: "sources-docs", children: "Inputs & Documents" }),
3548
- /* @__PURE__ */ jsx6(P, { children: "Inputs are the entry point for all data. Every document belongs to an input source \u2014 whether uploaded manually, synced from Google Drive, or ingested via API." }),
3699
+ /* @__PURE__ */ jsx6(P, { children: "Sources are the entry point for all data. Every document belongs to a source \u2014 whether uploaded manually, synced from Google Drive, or ingested via API." }),
3549
3700
  /* @__PURE__ */ jsx6(SubHeading, { id: "uploading", children: "Uploading Documents" }),
3550
3701
  /* @__PURE__ */ jsxs6(P, { children: [
3551
- "The Inputs page provides a drag-and-drop upload interface. You can upload individual files, multiple files, or entire folders. ZIP archives are unpacked recursively. When uploading folders, the original file path is preserved as a data field (",
3702
+ "The Sources page provides a drag-and-drop upload interface. You can upload individual files, multiple files, or entire folders. ZIP archives are unpacked recursively. When uploading folders, the original file path is preserved as a data field (",
3552
3703
  /* @__PURE__ */ jsx6("code", { children: "source_file_path" }),
3553
3704
  ") on each document \u2014 available for downstream processing and export."
3554
3705
  ] }),
3555
- /* @__PURE__ */ jsx6(UiExcerpt, { title: "Inputs \u2014 Upload Card", caption: "Drag files or folders onto the upload area. The progress indicator shows processing status in real-time.", children: /* @__PURE__ */ jsx6("div", { className: "max-w-sm", children: /* @__PURE__ */ jsxs6("div", { className: "border border-void-border rounded-lg p-4", children: [
3706
+ /* @__PURE__ */ jsx6(UiExcerpt, { title: "Sources \u2014 Upload Card", caption: "Drag files or folders onto the upload area. The progress indicator shows processing status in real-time.", children: /* @__PURE__ */ jsx6("div", { className: "max-w-sm", children: /* @__PURE__ */ jsxs6("div", { className: "border border-void-border rounded-lg p-4", children: [
3556
3707
  /* @__PURE__ */ jsxs6("div", { className: "flex items-center gap-3 mb-3", children: [
3557
3708
  /* @__PURE__ */ jsx6("div", { className: "w-10 h-10 rounded-lg bg-void-accent/10 flex items-center justify-center", children: /* @__PURE__ */ jsxs6("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "#673AB7", strokeWidth: "1.5", strokeLinecap: "round", children: [
3558
3709
  /* @__PURE__ */ jsx6("path", { d: "M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4" }),
@@ -3677,7 +3828,7 @@ function PlatformGuide({ LinkComponent }) {
3677
3828
  /* @__PURE__ */ jsx6(SubHeading, { id: "field-registry", children: "Field Registry" }),
3678
3829
  /* @__PURE__ */ jsxs6(P, { children: [
3679
3830
  "Navigate to ",
3680
- /* @__PURE__ */ jsx6("strong", { children: "Inputs \u2192 Field Library" }),
3831
+ /* @__PURE__ */ jsx6("strong", { children: "Sources Inputs \u2192rarr; Field Library" }),
3681
3832
  " to explore the registry. Every canonical field is displayed with its tier, data type, occurrence count, and document types."
3682
3833
  ] }),
3683
3834
  /* @__PURE__ */ jsx6(UiExcerpt, { title: "Field Library \u2014 Registry Table", caption: "Fields are organized by tier with occurrence counts, data types, and master instruction status.", children: /* @__PURE__ */ jsx6("div", { className: "border border-void-border rounded-lg overflow-hidden", children: /* @__PURE__ */ jsxs6("table", { className: "w-full text-[12px]", children: [
@@ -4076,7 +4227,7 @@ function PlatformGuide({ LinkComponent }) {
4076
4227
  /* @__PURE__ */ jsx6(P, { children: "Multiple layers of quality assurance: automated validation checks, ground truth benchmarking, and configurable approval gates." }),
4077
4228
  /* @__PURE__ */ jsx6(SubHeading, { id: "validation-checks", children: "Validation Checks" }),
4078
4229
  /* @__PURE__ */ jsx6(P, { children: "Schema-level quality rules run during Phase 3 of every job. Rule types: field format, value range, cross-field consistency, and AI-proposed coherence rules. Rules can be AI-proposed after a job completes, then reviewed and approved before activation." }),
4079
- /* @__PURE__ */ jsx6(SubHeading, { id: "golden-samples", children: "Golden Samples" }),
4230
+ /* @__PURE__ */ jsx6(SubHeading, { id: "ground-truth", children: "Golden Samples" }),
4080
4231
  /* @__PURE__ */ jsxs6(P, { children: [
4081
4232
  "Manually-created reference datasets with known-correct values. Create from",
4082
4233
  " ",
@@ -4085,43 +4236,127 @@ function PlatformGuide({ LinkComponent }) {
4085
4236
  ] }),
4086
4237
  /* @__PURE__ */ jsx6(SubHeading, { id: "approval-gates", children: "Approval Gates" }),
4087
4238
  /* @__PURE__ */ jsx6(P, { children: "Threshold-based rules for auto-approving or flagging results. Configure per schema with criteria: minimum confidence, validation pass rate, field coverage. Results meeting all thresholds are auto-approved; others go to the manual review queue." }),
4088
- /* @__PURE__ */ jsx6(Callout, { children: "Approval gates integrate with exports \u2014 configure triggers to only push approved rows to your downstream systems." }),
4089
- /* @__PURE__ */ jsx6(SectionHeading, { id: "delivery", children: "Outputs" }),
4090
- /* @__PURE__ */ jsx6(P, { children: "Push reviewed and approved data to any downstream system." }),
4091
- /* @__PURE__ */ jsx6(SubHeading, { id: "destinations", children: "Destinations" }),
4239
+ /* @__PURE__ */ jsxs6(Callout, { children: [
4240
+ "Approval gates feed the delivery pipeline \u2014 bind a",
4241
+ " ",
4242
+ /* @__PURE__ */ jsx6(InlineCode, { children: "result.approved" }),
4243
+ " signal to a destination to only ship approved rows to your downstream systems."
4244
+ ] }),
4245
+ /* @__PURE__ */ jsx6(SectionHeading, { id: "delivery", children: "Delivery" }),
4246
+ /* @__PURE__ */ jsx6(P, { children: "Push extracted, resolved, and reviewed data to any downstream system. Delivery is a typed, at-least-once pipeline with idempotency keys on the wire, append-only history, and a dead-letter queue for terminal failures." }),
4247
+ /* @__PURE__ */ jsx6(SubHeading, { id: "delivery-pipeline", children: "How Delivery Works" }),
4248
+ /* @__PURE__ */ jsx6(P, { children: "Every delivery flows through a five-stage pipeline:" }),
4092
4249
  /* @__PURE__ */ jsx6(
4093
4250
  ParamTable,
4094
4251
  {
4095
- title: "Supported destination types",
4252
+ title: "The delivery pipeline",
4096
4253
  params: [
4097
- { name: "Webhook", type: "HTTP POST", description: "HMAC-SHA256 signed payloads to your endpoint." },
4098
- { name: "REST API", type: "HTTP", description: "Push to any REST endpoint with configurable headers." },
4099
- { name: "SFTP", type: "file", description: "Upload files to SFTP servers." },
4100
- { name: "Email", type: "attachment", description: "Send structured data as email attachments." },
4101
- { name: "S3 / R2", type: "object storage", description: "Push to cloud object storage (AWS S3 or Cloudflare R2)." }
4254
+ { name: "1. Signal", type: "event", description: "A producer emits a typed event (e.g. document.extracted, result.approved) into the outbox. Producers are stateless \u2014 they only publish." },
4255
+ { name: "2. Binding", type: "match", description: "A poller drains the outbox and matches each event against active bindings. A binding joins a signal filter to a deliverable + destination + serializer." },
4256
+ { name: "3. Resolver", type: "load", description: "The deliverable resolver loads the payload (document metadata, a record snapshot, an extraction run, \u2026) at delivery time using only entity IDs from the signal." },
4257
+ { name: "4. Serializer", type: "encode", description: "The serializer encodes the payload into the wire format \u2014 json, ndjson, csv, csv_file, xlsx, rows, graph, raw, md, or txt \u2014 after an optional field_map projection." },
4258
+ { name: "5. Connector", type: "transport", description: "The connector ships the encoded bytes through the TransportWrapper (SSRF guard, payload cap, rate limit, retry ladder). Slice-1 connector is webhook." }
4102
4259
  ]
4103
4260
  }
4104
4261
  ),
4105
- /* @__PURE__ */ jsx6(SubHeading, { id: "field-mappings", children: "Field Mappings" }),
4106
4262
  /* @__PURE__ */ jsxs6(P, { children: [
4107
- "Transform extraction output fields to match your destination's expected format. Configure source-to-destination field translation rules with value transformations. Manage from",
4263
+ "Every attempt is logged in ",
4264
+ /* @__PURE__ */ jsx6(InlineCode, { children: "delivery_items" }),
4265
+ ". Terminal failures (retry exhausted or permanent 4xx) write a ",
4266
+ /* @__PURE__ */ jsx6(InlineCode, { children: "delivery_dead_letter" }),
4108
4267
  " ",
4109
- /* @__PURE__ */ jsx6("strong", { children: "Outputs \u2192 Column Mappings" }),
4268
+ "row, which is replayable. The outbox, history, DLQ, and catalog are all accessible via the",
4269
+ " ",
4270
+ /* @__PURE__ */ jsxs6(LinkComp, { href: "/docs", className: "text-void-accent hover:underline", children: [
4271
+ /* @__PURE__ */ jsx6(InlineCode, { children: "/v1/delivery/*" }),
4272
+ " API"
4273
+ ] }),
4110
4274
  "."
4111
4275
  ] }),
4112
- /* @__PURE__ */ jsx6(SubHeading, { id: "export-triggers", children: "Triggers" }),
4276
+ /* @__PURE__ */ jsx6(SubHeading, { id: "destinations", children: "Destinations" }),
4277
+ /* @__PURE__ */ jsxs6(P, { children: [
4278
+ "A destination is a connector + configuration + optional credentials. Slice-1 ships the webhook connector; S3, Google Sheets, Drive, SFTP, and Email arrive in later slices. Use ",
4279
+ /* @__PURE__ */ jsx6("strong", { children: "Delivery \u2192 Destinations" }),
4280
+ " to manage them from the dashboard, or",
4281
+ " ",
4282
+ /* @__PURE__ */ jsx6(InlineCode, { children: "POST /v1/delivery/destinations" }),
4283
+ " via the API. Every destination supports a live-ping ",
4284
+ /* @__PURE__ */ jsx6(InlineCode, { children: "POST /v1/delivery/destinations/:id/test" }),
4285
+ " ",
4286
+ "that exercises the full transport envelope with a tiny test payload."
4287
+ ] }),
4113
4288
  /* @__PURE__ */ jsx6(
4114
4289
  ParamTable,
4115
4290
  {
4116
- title: "Trigger types",
4291
+ title: "Supported connectors",
4117
4292
  params: [
4118
- { name: "Auto on approval", type: "event", description: "Export immediately when rows are approved (stage or push mode)." },
4119
- { name: "Scheduled", type: "cron", description: "Export on a recurring cron schedule." },
4120
- { name: "Manual", type: "button", description: "Export on demand via button click." }
4293
+ { name: "webhook", type: "HTTP POST", description: "Slice 1. HMAC-SHA256 signed payloads with idempotency keys, 30s timeout, SSRF guard, 5 MiB payload cap (overridable per destination)." },
4294
+ { name: "s3", type: "object storage", description: "Slice 2+. AWS S3 or Cloudflare R2 with per-destination prefix and partitioning." },
4295
+ { name: "sheets", type: "api", description: "Slice 2+. Google Sheets append/upsert via connected accounts (OAuth)." },
4296
+ { name: "drive", type: "api", description: "Slice 2+. Google Drive file upload via connected accounts." },
4297
+ { name: "sftp", type: "file", description: "Slice 2+. SFTP file upload with key or password auth." },
4298
+ { name: "email", type: "smtp", description: "Slice 2+. Structured data as email attachment." }
4121
4299
  ]
4122
4300
  }
4123
4301
  ),
4124
- /* @__PURE__ */ jsx6(P, { children: "Every export is logged as a record with delivery status and error details. Failed exports retry automatically with exponential backoff." }),
4302
+ /* @__PURE__ */ jsx6(SubHeading, { id: "bindings", children: "Bindings" }),
4303
+ /* @__PURE__ */ jsxs6(P, { children: [
4304
+ "A binding is the routing rule: it joins a ",
4305
+ /* @__PURE__ */ jsx6("strong", { children: "signal filter" }),
4306
+ " (which events?) to a ",
4307
+ /* @__PURE__ */ jsx6("strong", { children: "deliverable type" }),
4308
+ " (what payload shape?) to a ",
4309
+ /* @__PURE__ */ jsx6("strong", { children: "destination" }),
4310
+ " ",
4311
+ "(ship where?) via a ",
4312
+ /* @__PURE__ */ jsx6("strong", { children: "serializer" }),
4313
+ " (encoded how?). On create, the backend validates all four pieces form a compatible triangle \u2014 the serializer must support the resolver's shape, and the connector must support the serializer format."
4314
+ ] }),
4315
+ /* @__PURE__ */ jsxs6(P, { children: [
4316
+ "Optional ",
4317
+ /* @__PURE__ */ jsx6(InlineCode, { children: "field_map" }),
4318
+ " (rename/drop/static rules) lets you reshape the payload without custom code. Optional ",
4319
+ /* @__PURE__ */ jsx6(InlineCode, { children: "delivery_policy" }),
4320
+ " ",
4321
+ "overrides the default retry ladder (6 attempts at",
4322
+ " ",
4323
+ /* @__PURE__ */ jsx6(InlineCode, { children: "5s, 30s, 2min, 10min, 1h" }),
4324
+ ") and timeout."
4325
+ ] }),
4326
+ /* @__PURE__ */ jsx6(SubHeading, { id: "signals-catalog", children: "Signals & Catalog" }),
4327
+ /* @__PURE__ */ jsxs6(P, { children: [
4328
+ "The catalog API (",
4329
+ /* @__PURE__ */ jsx6(InlineCode, { children: "/v1/delivery/catalog/*" }),
4330
+ ") exposes the four registries that drive the binding picker. Use it to populate dropdowns rather than hardcoding lists \u2014 it always reflects the running registry contents."
4331
+ ] }),
4332
+ /* @__PURE__ */ jsx6(
4333
+ ParamTable,
4334
+ {
4335
+ title: "Core signal types",
4336
+ params: [
4337
+ { name: "document.extracted", type: "signal", description: "Fired when a document completes extraction with structured fields." },
4338
+ { name: "document.extraction_failed", type: "signal", description: "Fired when extraction fails terminally." },
4339
+ { name: "run.dataspace.completed", type: "signal", description: "Fired when a dataspace job run completes." },
4340
+ { name: "run.structuring.completed", type: "signal", description: "Fired when a structuring run completes." },
4341
+ { name: "run.resolution.completed", type: "signal", description: "Fired when a resolution run (field normalization + transforms) completes." },
4342
+ { name: "run.extraction.completed", type: "signal", description: "Fired when a multi-document extraction (batch-inference) run completes." },
4343
+ { name: "result.approved", type: "signal", description: "Fired when a reviewer approves a record." },
4344
+ { name: "result.rejected", type: "signal", description: "Fired when a reviewer rejects a record." },
4345
+ { name: "result.flagged", type: "signal", description: "Fired when validation flags fire on a record." },
4346
+ { name: "delivery.item.completed", type: "meta", description: "Fired after a successful delivery. Meta-signal \u2014 the poller prevents re-binding loops." },
4347
+ { name: "delivery.item.failed", type: "meta", description: "Fired after a terminal delivery failure." }
4348
+ ]
4349
+ }
4350
+ ),
4351
+ /* @__PURE__ */ jsx6(SubHeading, { id: "delivery-history", children: "History & DLQ" }),
4352
+ /* @__PURE__ */ jsxs6(P, { children: [
4353
+ "Every delivery attempt writes a row to ",
4354
+ /* @__PURE__ */ jsx6(InlineCode, { children: "/v1/delivery/items" }),
4355
+ " with its status, HTTP code, error code, and request/response bodies. Terminal failures (retry ladder exhausted or permanent 4xx) escalate to",
4356
+ " ",
4357
+ /* @__PURE__ */ jsx6(InlineCode, { children: "/v1/delivery/dlq" }),
4358
+ ". Both are fully replayable \u2014 replay enqueues a new attempt with a fresh idempotency key. Nothing in history is ever mutated; the log is strictly append-only."
4359
+ ] }),
4125
4360
  /* @__PURE__ */ jsx6(SectionHeading, { id: "search-filtering", children: "Search & Filtering" }),
4126
4361
  /* @__PURE__ */ jsx6(SubHeading, { id: "omnisearch", children: "Omnisearch" }),
4127
4362
  /* @__PURE__ */ jsxs6(P, { children: [
@@ -4173,23 +4408,50 @@ function PlatformGuide({ LinkComponent }) {
4173
4408
  { name: "/v1/documents", type: "CRUD", description: "Document listing, detail, and deletion with cursor pagination." },
4174
4409
  { name: "/v1/extractions", type: "CRUD", description: "Extraction results and field corrections." },
4175
4410
  { name: "/v1/schemas", type: "CRUD", description: "Schema management \u2014 create, update, delete." },
4176
- { name: "/v1/jobs", type: "CRUD", description: "Async job tracking and results." },
4411
+ { name: "/v1/jobs", type: "CRUD", description: "Async job tracking, results, and N-Shot comparisons with override and judge decisions." },
4177
4412
  { name: "/v1/sources", type: "CRUD", description: "API source management and document ingest." },
4178
- { name: "/v1/webhooks", type: "CRUD", description: "Webhook endpoint configuration." }
4413
+ { name: "/v1/delivery", type: "CRUD", description: "Outbound delivery: destinations, bindings, history, DLQ, outbox, catalog." },
4414
+ { name: "/v1/resolutions", type: "CRUD", description: "Resolution runs \u2014 field normalization, transforms, and lookup cascades." },
4415
+ { name: "/v1/linking", type: "mixed", description: "Document linking: link keys, document links, entity graph, classification, backfill, and document-case mapping." },
4416
+ { name: "/v1/schema-graph", type: "mixed", description: "Schema class ontology: versioned classes, diffs with approval workflow, edges, aliases, and visualization." },
4417
+ { name: "/v1/structuring", type: "CRUD", description: "Validation checks, approval gates with rules, result checks, pending approvals, and delivery triggers." },
4418
+ { name: "/v1/telemetry", type: "GET", description: "Structuring metrics: per-schema and per-run summaries, trends, and field-level breakdowns." },
4419
+ { name: "/v1/validation", type: "CRUD", description: "Golden samples and validation runs for measuring extraction accuracy against ground truth." },
4420
+ { name: "/v1/credits", type: "GET", description: "Credit balance, transaction history, usage summaries, daily breakdown, and per-request usage log." },
4421
+ { name: "/v1/cases", type: "CRUD", description: "Cases: status updates, edge confirmation/rejection, split/merge, completeness, document pinning." },
4422
+ { name: "/v1/batches", type: "mixed", description: "Batch inference: listing, detail, provider sync, and cancellation." },
4423
+ { name: "/v1/matching", type: "CRUD", description: "Smart matching: configurations, strategies, smart runs, AI resolution, results, progress, and review." },
4424
+ { name: "/v1/review", type: "mixed", description: "Review queue: assignment, actions, batch operations, and statistics." },
4425
+ { name: "/v1/quality", type: "CRUD", description: "Ground truth datasets with entries, benchmarks with results and comparison." },
4426
+ { name: "/v1/reference-data", type: "CRUD", description: "Reference datasets: file and JSON upload, row browsing, and management." }
4179
4427
  ]
4180
4428
  }
4181
4429
  ),
4182
4430
  /* @__PURE__ */ jsx6(SubHeading, { id: "webhooks", children: "Webhooks" }),
4183
4431
  /* @__PURE__ */ jsx6(P, { children: "Webhooks push real-time notifications when events occur. All payloads are HMAC-SHA256 signed. Failed deliveries retry with exponential backoff." }),
4432
+ /* @__PURE__ */ jsxs6(P, { children: [
4433
+ "The webhook connector is configured as a ",
4434
+ /* @__PURE__ */ jsx6("strong", { children: "delivery destination" }),
4435
+ ". Bind any of the signal types below to a webhook destination to receive real-time notifications. See ",
4436
+ /* @__PURE__ */ jsx6(InlineCode, { children: "/v1/delivery/catalog/signals" }),
4437
+ " for the exhaustive list."
4438
+ ] }),
4184
4439
  /* @__PURE__ */ jsx6(
4185
4440
  ParamTable,
4186
4441
  {
4187
- title: "Webhook event types",
4442
+ title: "Delivery signal types (webhook-compatible)",
4188
4443
  params: [
4189
- { name: "extraction.completed", type: "event", description: "A document extraction has finished." },
4190
- { name: "job.completed", type: "event", description: "An extraction job has completed all phases." },
4191
- { name: "export.completed", type: "event", description: "An export has been delivered." },
4192
- { name: "validation.completed", type: "event", description: "A validation run has finished." }
4444
+ { name: "document.extracted", type: "event", description: "A document extraction has finished successfully." },
4445
+ { name: "document.extraction_failed", type: "event", description: "A document extraction has failed terminally." },
4446
+ { name: "run.dataspace.completed", type: "event", description: "A dataspace job run completed." },
4447
+ { name: "run.structuring.completed", type: "event", description: "A structuring run completed." },
4448
+ { name: "run.resolution.completed", type: "event", description: "A resolution run (field normalization + transforms) completed." },
4449
+ { name: "run.extraction.completed", type: "event", description: "A multi-document extraction (batch-inference) run completed." },
4450
+ { name: "result.approved", type: "event", description: "A reviewer approved a record." },
4451
+ { name: "result.rejected", type: "event", description: "A reviewer rejected a record." },
4452
+ { name: "result.flagged", type: "event", description: "Validation flags fired on a record." },
4453
+ { name: "delivery.item.completed", type: "meta", description: "A delivery succeeded. Meta-signal \u2014 not re-delivered to avoid loops." },
4454
+ { name: "delivery.item.failed", type: "meta", description: "A delivery failed terminally." }
4193
4455
  ]
4194
4456
  }
4195
4457
  ),
@@ -4463,6 +4725,77 @@ var API_NAV_SECTIONS = [
4463
4725
  { id: "webhook-verification", label: "Signature Verification" },
4464
4726
  { id: "webhook-retries", label: "Retry Policy" }
4465
4727
  ] },
4728
+ { id: "resolutions", label: "Resolutions", children: [
4729
+ { id: "list-resolutions", label: "List Resolutions" },
4730
+ { id: "create-resolution", label: "Create Resolution" },
4731
+ { id: "get-resolution", label: "Get Resolution" },
4732
+ { id: "get-resolution-results", label: "Get Results" },
4733
+ { id: "execute-resolution", label: "Execute Resolution" },
4734
+ { id: "delete-resolution", label: "Delete Resolution" }
4735
+ ] },
4736
+ { id: "linking", label: "Linking", children: [
4737
+ { id: "list-link-keys", label: "Link Keys" },
4738
+ { id: "get-document-links", label: "Document Links" },
4739
+ { id: "get-linking-graph", label: "Full Graph" },
4740
+ { id: "get-document-graph", label: "Document Graph" },
4741
+ { id: "classify-link-keys", label: "Classify" },
4742
+ { id: "backfill-linking", label: "Backfill" },
4743
+ { id: "backfill-progress", label: "Backfill Progress" },
4744
+ { id: "document-case-map", label: "Document-Case Map" }
4745
+ ] },
4746
+ { id: "nshot", label: "N-Shot", children: [
4747
+ { id: "nshot-summary", label: "Summary" },
4748
+ { id: "nshot-comparisons", label: "Comparisons" },
4749
+ { id: "nshot-comparison", label: "Single Comparison" },
4750
+ { id: "nshot-override", label: "Override" },
4751
+ { id: "nshot-judge-decision", label: "Judge Decision" }
4752
+ ] },
4753
+ { id: "schema-graph", label: "Schema Graph", children: [
4754
+ { id: "list-schema-graph-classes", label: "List Classes" },
4755
+ { id: "get-schema-graph-class", label: "Get Class" },
4756
+ { id: "list-class-versions", label: "List Versions" },
4757
+ { id: "get-class-version", label: "Get Version" },
4758
+ { id: "list-schema-graph-diffs", label: "List Diffs" },
4759
+ { id: "approve-diff", label: "Approve Diff" },
4760
+ { id: "reject-diff", label: "Reject Diff" },
4761
+ { id: "list-schema-graph-edges", label: "Edges" },
4762
+ { id: "list-schema-graph-aliases", label: "Aliases" },
4763
+ { id: "visualize-schema-graph", label: "Visualize" }
4764
+ ] },
4765
+ { id: "structuring", label: "Structuring", children: [
4766
+ { id: "list-structuring-checks", label: "List Checks" },
4767
+ { id: "create-structuring-check", label: "Create Check" },
4768
+ { id: "get-structuring-check", label: "Get / Update / Delete Check" },
4769
+ { id: "list-structuring-gates", label: "List Gates" },
4770
+ { id: "create-structuring-gate", label: "Create Gate" },
4771
+ { id: "get-structuring-gate", label: "Get / Update / Delete Gate" },
4772
+ { id: "gate-rules", label: "Gate Rules" },
4773
+ { id: "result-checks", label: "Result Checks" },
4774
+ { id: "pending-approvals", label: "Pending Approvals" },
4775
+ { id: "approve-reject-result", label: "Approve / Reject Result" },
4776
+ { id: "trigger-delivery", label: "Trigger Delivery" }
4777
+ ] },
4778
+ { id: "telemetry", label: "Telemetry", children: [
4779
+ { id: "schema-telemetry-summary", label: "Schema Summary" },
4780
+ { id: "schema-telemetry-trend", label: "Schema Trend" },
4781
+ { id: "schema-telemetry-fields", label: "Schema Fields" },
4782
+ { id: "run-telemetry-summary", label: "Run Summary" }
4783
+ ] },
4784
+ { id: "validation", label: "Validation", children: [
4785
+ { id: "list-golden-samples", label: "List Golden Samples" },
4786
+ { id: "get-golden-sample", label: "Get / Delete Golden Sample" },
4787
+ { id: "list-validation-runs", label: "List Validation Runs" },
4788
+ { id: "create-validation-run", label: "Create Validation Run" },
4789
+ { id: "get-validation-run", label: "Get / Delete Validation Run" },
4790
+ { id: "get-validation-results", label: "Validation Results" }
4791
+ ] },
4792
+ { id: "credits", label: "Credits", children: [
4793
+ { id: "credits-balance", label: "Balance" },
4794
+ { id: "credits-history", label: "History" },
4795
+ { id: "credits-usage", label: "Usage Summary" },
4796
+ { id: "credits-usage-daily", label: "Daily Usage" },
4797
+ { id: "credits-usage-log", label: "Usage Log" }
4798
+ ] },
4466
4799
  { id: "errors-rate-limits", label: "Errors & Rate Limits", children: [
4467
4800
  { id: "error-format", label: "Error Format" },
4468
4801
  { id: "error-codes", label: "Error Codes" },
@@ -4562,6 +4895,13 @@ var API_SECTION_META = [
4562
4895
  { id: "sources", title: "Inputs API", description: "Manage document sources for programmatic ingestion. Each source has its own API key and supports batch processing." },
4563
4896
  { id: "filter-search", title: "Filter & Search API", description: "Field autocomplete, document filtering with composable conditions, global omnisearch, and saved filter management." },
4564
4897
  { id: "webhooks", title: "Webhooks", description: "Real-time event notifications with HMAC-SHA256 signed payloads, delivery tracking, and exponential backoff retries." },
4898
+ { id: "resolutions", title: "Resolutions API", description: "Resolution runs \u2014 apply field normalization, transforms, and lookup cascades to extracted data. List, create, execute, and delete resolution runs." },
4899
+ { id: "linking", title: "Linking API", description: "Document linking graph \u2014 link keys, document links, entity graph, classification, backfill operations, and document-case mapping." },
4900
+ { id: "nshot", title: "N-Shot API", description: "N-Shot comparison endpoints for job runs \u2014 summary, field comparisons, overrides, and AI/human judge decisions." },
4901
+ { id: "schema-graph", title: "Schema Graph API", description: "Schema class ontology \u2014 versioned classes, diffs with approval/rejection workflow, inter-class edges, aliases, and D3-compatible visualization." },
4902
+ { id: "structuring", title: "Structuring API", description: "Validation checks CRUD, approval gates with configurable rules, result check outcomes, pending approvals queue, and delivery triggers." },
4903
+ { id: "validation", title: "Validation API", description: "Golden sample management and validation runs for measuring extraction accuracy against ground truth datasets." },
4904
+ { id: "credits", title: "Credits API", description: "Credit balance, transaction history, aggregate usage summaries, daily usage breakdown, and per-request usage log." },
4565
4905
  { id: "errors-rate-limits", title: "Errors & Rate Limits", description: "Error response format, error codes, rate limit tiers by plan, and rate limit headers." }
4566
4906
  ];
4567
4907
  var PLATFORM_SECTION_META = [
@@ -4678,6 +5018,265 @@ var OPENAPI_SPEC = {
4678
5018
  "/v1/sources/{id}/documents": {
4679
5019
  get: { operationId: "listSourceDocuments", summary: "List documents in a source", tags: ["Sources"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Paginated documents" } } },
4680
5020
  post: { operationId: "ingestDocument", summary: "Ingest a document into a source", tags: ["Sources"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Ingested document" } } }
5021
+ },
5022
+ // Resolutions
5023
+ "/v1/resolutions": {
5024
+ get: { operationId: "listResolutions", summary: "List resolution runs", tags: ["Resolutions"], responses: { "200": { description: "Paginated list of resolution runs" } } },
5025
+ post: { operationId: "createResolution", summary: "Create a resolution run", tags: ["Resolutions"], responses: { "201": { description: "Resolution run created" } } }
5026
+ },
5027
+ "/v1/resolutions/{id}": {
5028
+ get: { operationId: "getResolution", summary: "Get a resolution run", tags: ["Resolutions"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Resolution run detail" } } },
5029
+ delete: { operationId: "deleteResolution", summary: "Delete a resolution run", tags: ["Resolutions"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Resolution run deleted" } } }
5030
+ },
5031
+ "/v1/resolutions/{id}/results": {
5032
+ get: { operationId: "getResolutionResults", summary: "Get resolution run results", tags: ["Resolutions"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Resolution results" } } }
5033
+ },
5034
+ "/v1/resolutions/{id}/execute": {
5035
+ post: { operationId: "executeResolution", summary: "Execute a resolution run", tags: ["Resolutions"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Resolution execution started" } } }
5036
+ },
5037
+ // Linking
5038
+ "/v1/linking/link-keys": {
5039
+ get: { operationId: "listLinkKeys", summary: "List link keys", tags: ["Linking"], responses: { "200": { description: "List of link keys" } } }
5040
+ },
5041
+ "/v1/linking/documents/{id}/links": {
5042
+ get: { operationId: "getDocumentLinks", summary: "Get links for a document", tags: ["Linking"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Document links" } } }
5043
+ },
5044
+ "/v1/linking/graph": {
5045
+ get: { operationId: "getLinkingGraph", summary: "Get the full linking graph", tags: ["Linking"], responses: { "200": { description: "Full linking graph" } } }
5046
+ },
5047
+ "/v1/linking/graph/documents/{id}": {
5048
+ get: { operationId: "getDocumentGraph", summary: "Get graph neighbourhood for a document", tags: ["Linking"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Document-centric subgraph" } } }
5049
+ },
5050
+ "/v1/linking/classify": {
5051
+ post: { operationId: "classifyLinkKeys", summary: "Classify link keys", tags: ["Linking"], responses: { "200": { description: "Classification results" } } }
5052
+ },
5053
+ "/v1/linking/backfill": {
5054
+ post: { operationId: "backfillLinking", summary: "Backfill linking data", tags: ["Linking"], responses: { "202": { description: "Backfill started" } } }
5055
+ },
5056
+ "/v1/linking/backfill/progress": {
5057
+ get: { operationId: "getBackfillProgress", summary: "Get backfill progress", tags: ["Linking"], responses: { "200": { description: "Backfill progress" } } }
5058
+ },
5059
+ "/v1/linking/document-case-map": {
5060
+ get: { operationId: "getDocumentCaseMap", summary: "Get document-to-case mapping", tags: ["Linking"], responses: { "200": { description: "Document-case mapping" } } }
5061
+ },
5062
+ // N-Shot
5063
+ "/v1/jobs/runs/{runId}/nshot/summary": {
5064
+ get: { operationId: "getNshotSummary", summary: "Get N-Shot summary for a run", tags: ["N-Shot"], parameters: [{ name: "runId", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "N-Shot summary" } } }
5065
+ },
5066
+ "/v1/jobs/runs/{runId}/nshot/comparisons": {
5067
+ get: { operationId: "listNshotComparisons", summary: "List N-Shot comparisons", tags: ["N-Shot"], parameters: [{ name: "runId", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "List of comparisons" } } }
5068
+ },
5069
+ "/v1/jobs/runs/{runId}/nshot/comparison": {
5070
+ get: { operationId: "getNshotComparison", summary: "Get a specific N-Shot comparison", tags: ["N-Shot"], parameters: [{ name: "runId", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Single comparison result" } } }
5071
+ },
5072
+ "/v1/jobs/runs/{runId}/nshot/override": {
5073
+ post: { operationId: "nshotOverride", summary: "Override an N-Shot value", tags: ["N-Shot"], parameters: [{ name: "runId", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Override applied" } } }
5074
+ },
5075
+ "/v1/jobs/runs/{runId}/nshot/judge-decision": {
5076
+ post: { operationId: "nshotJudgeDecision", summary: "Submit a judge decision for N-Shot", tags: ["N-Shot"], parameters: [{ name: "runId", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Judge decision recorded" } } }
5077
+ },
5078
+ // Schema Graph
5079
+ "/v1/schema-graph/classes": {
5080
+ get: { operationId: "listSchemaGraphClasses", summary: "List schema graph classes", tags: ["Schema Graph"], responses: { "200": { description: "List of schema graph classes" } } }
5081
+ },
5082
+ "/v1/schema-graph/classes/{id}": {
5083
+ get: { operationId: "getSchemaGraphClass", summary: "Get a schema graph class", tags: ["Schema Graph"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Schema graph class detail" } } }
5084
+ },
5085
+ "/v1/schema-graph/classes/{id}/versions": {
5086
+ get: { operationId: "listSchemaGraphClassVersions", summary: "List versions of a schema graph class", tags: ["Schema Graph"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "List of class versions" } } }
5087
+ },
5088
+ "/v1/schema-graph/classes/{id}/versions/{version}": {
5089
+ get: { operationId: "getSchemaGraphClassVersion", summary: "Get a specific class version", tags: ["Schema Graph"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }, { name: "version", in: "path", required: true, schema: { type: "integer" } }], responses: { "200": { description: "Class version detail" } } }
5090
+ },
5091
+ "/v1/schema-graph/diffs": {
5092
+ get: { operationId: "listSchemaGraphDiffs", summary: "List schema graph diffs", tags: ["Schema Graph"], responses: { "200": { description: "List of diffs" } } }
5093
+ },
5094
+ "/v1/schema-graph/diffs/{id}/approve": {
5095
+ post: { operationId: "approveSchemaGraphDiff", summary: "Approve a schema graph diff", tags: ["Schema Graph"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Diff approved" } } }
5096
+ },
5097
+ "/v1/schema-graph/diffs/{id}/reject": {
5098
+ post: { operationId: "rejectSchemaGraphDiff", summary: "Reject a schema graph diff", tags: ["Schema Graph"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Diff rejected" } } }
5099
+ },
5100
+ "/v1/schema-graph/edges": {
5101
+ get: { operationId: "listSchemaGraphEdges", summary: "List schema graph edges", tags: ["Schema Graph"], responses: { "200": { description: "List of edges" } } }
5102
+ },
5103
+ "/v1/schema-graph/aliases": {
5104
+ get: { operationId: "listSchemaGraphAliases", summary: "List schema graph aliases", tags: ["Schema Graph"], responses: { "200": { description: "List of aliases" } } }
5105
+ },
5106
+ "/v1/schema-graph/visualize": {
5107
+ get: { operationId: "visualizeSchemaGraph", summary: "Get schema graph visualization data", tags: ["Schema Graph"], responses: { "200": { description: "Visualization data" } } }
5108
+ },
5109
+ // Structuring
5110
+ "/v1/structuring/checks": {
5111
+ get: { operationId: "listStructuringChecks", summary: "List structuring checks", tags: ["Structuring"], responses: { "200": { description: "Paginated list of structuring checks" } } },
5112
+ post: { operationId: "createStructuringCheck", summary: "Create a structuring check", tags: ["Structuring"], responses: { "201": { description: "Structuring check created" } } }
5113
+ },
5114
+ "/v1/structuring/checks/{id}": {
5115
+ get: { operationId: "getStructuringCheck", summary: "Get a structuring check", tags: ["Structuring"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Structuring check detail" } } },
5116
+ put: { operationId: "updateStructuringCheck", summary: "Update a structuring check", tags: ["Structuring"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Structuring check updated" } } },
5117
+ delete: { operationId: "deleteStructuringCheck", summary: "Delete a structuring check", tags: ["Structuring"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Structuring check deleted" } } }
5118
+ },
5119
+ "/v1/structuring/gates": {
5120
+ get: { operationId: "listStructuringGates", summary: "List approval gates", tags: ["Structuring"], responses: { "200": { description: "Paginated list of approval gates" } } },
5121
+ post: { operationId: "createStructuringGate", summary: "Create an approval gate", tags: ["Structuring"], responses: { "201": { description: "Approval gate created" } } }
5122
+ },
5123
+ "/v1/structuring/gates/{id}": {
5124
+ get: { operationId: "getStructuringGate", summary: "Get an approval gate", tags: ["Structuring"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Approval gate detail" } } },
5125
+ put: { operationId: "updateStructuringGate", summary: "Update an approval gate", tags: ["Structuring"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Approval gate updated" } } },
5126
+ delete: { operationId: "deleteStructuringGate", summary: "Delete an approval gate", tags: ["Structuring"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Approval gate deleted" } } }
5127
+ },
5128
+ "/v1/structuring/gates/{id}/rules": {
5129
+ post: { operationId: "addStructuringGateRule", summary: "Add a rule to an approval gate", tags: ["Structuring"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "201": { description: "Rule added" } } },
5130
+ delete: { operationId: "deleteStructuringGateRule", summary: "Remove a rule from an approval gate", tags: ["Structuring"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Rule removed" } } }
5131
+ },
5132
+ "/v1/structuring/results/{id}/checks": {
5133
+ get: { operationId: "getStructuringResultChecks", summary: "Get check results for a structuring result", tags: ["Structuring"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Check results" } } }
5134
+ },
5135
+ "/v1/structuring/approvals/pending": {
5136
+ get: { operationId: "listPendingApprovals", summary: "List pending approvals", tags: ["Structuring"], responses: { "200": { description: "Paginated list of pending approvals" } } }
5137
+ },
5138
+ "/v1/structuring/approvals/{id}/approve": {
5139
+ post: { operationId: "approveStructuringResult", summary: "Approve a structuring result", tags: ["Structuring"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Result approved" } } }
5140
+ },
5141
+ "/v1/structuring/approvals/{id}/reject": {
5142
+ post: { operationId: "rejectStructuringResult", summary: "Reject a structuring result", tags: ["Structuring"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Result rejected" } } }
5143
+ },
5144
+ "/v1/structuring/delivery/{runId}": {
5145
+ post: { operationId: "triggerStructuringDelivery", summary: "Trigger delivery for a structuring run", tags: ["Structuring"], parameters: [{ name: "runId", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Delivery triggered" } } }
5146
+ },
5147
+ // Telemetry
5148
+ "/v1/telemetry/schemas/{id}/summary": {
5149
+ get: { operationId: "getTelemetrySchemaSummary", summary: "Get telemetry summary for a schema", tags: ["Telemetry"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Schema telemetry summary" } } }
5150
+ },
5151
+ "/v1/telemetry/schemas/{id}/trend": {
5152
+ get: { operationId: "getTelemetrySchemaTrend", summary: "Get telemetry trend for a schema", tags: ["Telemetry"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Schema telemetry trend" } } }
5153
+ },
5154
+ "/v1/telemetry/schemas/{id}/fields": {
5155
+ get: { operationId: "getTelemetrySchemaFields", summary: "Get per-field telemetry for a schema", tags: ["Telemetry"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Per-field telemetry" } } }
5156
+ },
5157
+ "/v1/telemetry/runs/{id}/summary": {
5158
+ get: { operationId: "getTelemetryRunSummary", summary: "Get telemetry summary for a run", tags: ["Telemetry"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Run telemetry summary" } } }
5159
+ },
5160
+ // Validation
5161
+ "/v1/validation/golden-samples": {
5162
+ get: { operationId: "listGoldenSamples", summary: "List golden samples", tags: ["Validation"], responses: { "200": { description: "Paginated list of golden samples" } } }
5163
+ },
5164
+ "/v1/validation/golden-samples/{id}": {
5165
+ get: { operationId: "getGoldenSample", summary: "Get a golden sample", tags: ["Validation"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Golden sample detail" } } },
5166
+ delete: { operationId: "deleteGoldenSample", summary: "Delete a golden sample", tags: ["Validation"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Golden sample deleted" } } }
5167
+ },
5168
+ "/v1/validation/runs": {
5169
+ get: { operationId: "listValidationRuns", summary: "List validation runs", tags: ["Validation"], responses: { "200": { description: "Paginated list of validation runs" } } },
5170
+ post: { operationId: "createValidationRun", summary: "Create a validation run", tags: ["Validation"], responses: { "201": { description: "Validation run created" } } }
5171
+ },
5172
+ "/v1/validation/runs/{id}": {
5173
+ get: { operationId: "getValidationRun", summary: "Get a validation run", tags: ["Validation"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Validation run detail" } } },
5174
+ delete: { operationId: "deleteValidationRun", summary: "Delete a validation run", tags: ["Validation"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Validation run deleted" } } }
5175
+ },
5176
+ "/v1/validation/runs/{id}/results": {
5177
+ get: { operationId: "getValidationRunResults", summary: "Get validation run results", tags: ["Validation"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Validation run results" } } }
5178
+ },
5179
+ // Credits
5180
+ "/v1/credits/balance": {
5181
+ get: { operationId: "getCreditsBalance", summary: "Get credit balance", tags: ["Credits"], responses: { "200": { description: "Credit balance" } } }
5182
+ },
5183
+ "/v1/credits/history": {
5184
+ get: { operationId: "getCreditsHistory", summary: "Get credit history", tags: ["Credits"], responses: { "200": { description: "Paginated credit history" } } }
5185
+ },
5186
+ "/v1/credits/usage": {
5187
+ get: { operationId: "getCreditsUsage", summary: "Get credit usage summary", tags: ["Credits"], responses: { "200": { description: "Credit usage summary" } } }
5188
+ },
5189
+ "/v1/credits/usage/daily": {
5190
+ get: { operationId: "getCreditsUsageDaily", summary: "Get daily credit usage", tags: ["Credits"], responses: { "200": { description: "Daily credit usage" } } }
5191
+ },
5192
+ "/v1/credits/usage/log": {
5193
+ get: { operationId: "getCreditsUsageLog", summary: "Get credit usage log", tags: ["Credits"], responses: { "200": { description: "Paginated usage log" } } }
5194
+ },
5195
+ // Expanded: Cases
5196
+ "/v1/cases/{key}/status": {
5197
+ patch: { operationId: "updateCaseStatus", summary: "Update case status", tags: ["Cases"], parameters: [{ name: "key", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Case status updated" } } }
5198
+ },
5199
+ "/v1/cases/{key}/edges": {
5200
+ get: { operationId: "getCaseEdges", summary: "Get case edges", tags: ["Cases"], parameters: [{ name: "key", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Case edges" } } }
5201
+ },
5202
+ "/v1/cases/edges/confirm": {
5203
+ post: { operationId: "confirmCaseEdge", summary: "Confirm a case edge", tags: ["Cases"], responses: { "200": { description: "Edge confirmed" } } }
5204
+ },
5205
+ "/v1/cases/edges/reject": {
5206
+ post: { operationId: "rejectCaseEdge", summary: "Reject a case edge", tags: ["Cases"], responses: { "200": { description: "Edge rejected" } } }
5207
+ },
5208
+ "/v1/cases/{key}/split": {
5209
+ post: { operationId: "splitCase", summary: "Split a case", tags: ["Cases"], parameters: [{ name: "key", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Case split" } } }
5210
+ },
5211
+ "/v1/cases/{key}/merge": {
5212
+ post: { operationId: "mergeCases", summary: "Merge cases", tags: ["Cases"], parameters: [{ name: "key", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Cases merged" } } }
5213
+ },
5214
+ "/v1/cases/{key}/completeness": {
5215
+ get: { operationId: "getCaseCompleteness", summary: "Get case completeness", tags: ["Cases"], parameters: [{ name: "key", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Completeness assessment" } } }
5216
+ },
5217
+ "/v1/cases/{key}/pin": {
5218
+ post: { operationId: "pinCaseDocuments", summary: "Pin documents to a case", tags: ["Cases"], parameters: [{ name: "key", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Documents pinned" } } }
5219
+ },
5220
+ "/v1/cases/{key}/documents": {
5221
+ delete: { operationId: "removeCaseDocuments", summary: "Remove documents from a case", tags: ["Cases"], parameters: [{ name: "key", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Documents removed" } } }
5222
+ },
5223
+ // Expanded: Batches
5224
+ "/v1/batches/{id}/sync": {
5225
+ post: { operationId: "syncBatch", summary: "Sync batch status with provider", tags: ["Batches"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Batch synced" } } }
5226
+ },
5227
+ "/v1/batches/{id}/cancel": {
5228
+ post: { operationId: "cancelBatch", summary: "Cancel a batch inference run", tags: ["Batches"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Batch cancelled" } } }
5229
+ },
5230
+ // Expanded: Matching
5231
+ "/v1/matching/smart-run": {
5232
+ post: { operationId: "triggerSmartMatchingRun", summary: "Trigger a smart matching run", tags: ["Matching"], responses: { "201": { description: "Smart matching run queued" } } }
5233
+ },
5234
+ "/v1/matching/ai-resolve": {
5235
+ post: { operationId: "aiResolveMatching", summary: "AI-resolve ambiguous matches", tags: ["Matching"], responses: { "200": { description: "AI resolution results" } } }
5236
+ },
5237
+ "/v1/matching/strategies": {
5238
+ get: { operationId: "listMatchingStrategies", summary: "List matching strategies", tags: ["Matching"], responses: { "200": { description: "List of matching strategies" } } },
5239
+ post: { operationId: "createMatchingStrategy", summary: "Create a matching strategy", tags: ["Matching"], responses: { "201": { description: "Matching strategy created" } } }
5240
+ },
5241
+ "/v1/matching/strategies/{id}": {
5242
+ get: { operationId: "getMatchingStrategy", summary: "Get a matching strategy", tags: ["Matching"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Matching strategy detail" } } },
5243
+ put: { operationId: "updateMatchingStrategy", summary: "Update a matching strategy", tags: ["Matching"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Matching strategy updated" } } },
5244
+ delete: { operationId: "deleteMatchingStrategy", summary: "Delete a matching strategy", tags: ["Matching"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Matching strategy deleted" } } }
5245
+ },
5246
+ "/v1/matching/runs/{id}/results": {
5247
+ get: { operationId: "getMatchingRunResults", summary: "Get matching run results", tags: ["Matching"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Matching run results" } } }
5248
+ },
5249
+ "/v1/matching/runs/{id}/progress": {
5250
+ get: { operationId: "getMatchingRunProgress", summary: "Get matching run progress", tags: ["Matching"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Matching run progress" } } }
5251
+ },
5252
+ "/v1/matching/review": {
5253
+ post: { operationId: "submitMatchingReview", summary: "Submit matching review decisions", tags: ["Matching"], responses: { "200": { description: "Review decisions applied" } } }
5254
+ },
5255
+ // Expanded: Review
5256
+ "/v1/review/assign": {
5257
+ post: { operationId: "assignReview", summary: "Assign review records", tags: ["Review"], responses: { "200": { description: "Records assigned" } } }
5258
+ },
5259
+ "/v1/review/stats": {
5260
+ get: { operationId: "getReviewStats", summary: "Get review queue statistics", tags: ["Review"], responses: { "200": { description: "Review statistics" } } }
5261
+ },
5262
+ // Expanded: Quality
5263
+ "/v1/quality/ground-truth/{id}/entries": {
5264
+ get: { operationId: "listGroundTruthEntries", summary: "List ground truth entries", tags: ["Quality"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Paginated list of entries" } } },
5265
+ post: { operationId: "createGroundTruthEntry", summary: "Add a ground truth entry", tags: ["Quality"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "201": { description: "Entry created" } } }
5266
+ },
5267
+ "/v1/quality/ground-truth/{id}/entries/{entryId}": {
5268
+ put: { operationId: "updateGroundTruthEntry", summary: "Update a ground truth entry", tags: ["Quality"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }, { name: "entryId", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Entry updated" } } },
5269
+ delete: { operationId: "deleteGroundTruthEntry", summary: "Delete a ground truth entry", tags: ["Quality"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }, { name: "entryId", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Entry deleted" } } }
5270
+ },
5271
+ "/v1/quality/benchmarks/{id}/results": {
5272
+ get: { operationId: "getBenchmarkResults", summary: "Get benchmark results", tags: ["Quality"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Benchmark results" } } }
5273
+ },
5274
+ "/v1/quality/benchmarks/{id}/compare": {
5275
+ get: { operationId: "compareBenchmarks", summary: "Compare two benchmark runs", tags: ["Quality"], parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "Benchmark comparison" } } }
5276
+ },
5277
+ // Expanded: Reference Data
5278
+ "/v1/reference-data/create": {
5279
+ post: { operationId: "createReferenceDataJson", summary: "Create reference data from JSON", tags: ["Reference Data"], responses: { "201": { description: "Reference dataset created" } } }
4681
5280
  }
4682
5281
  }
4683
5282
  };
@@ -4698,52 +5297,147 @@ var PLATFORM_FAQ = [
4698
5297
  ];
4699
5298
  var LLMS_TXT = `# Talonic
4700
5299
 
4701
- > Extract any document into schema-validated data with a single API call.
5300
+ > AI-powered document structuring platform that turns unstructured files into schema-validated, provenance-tracked structured data.
4702
5301
 
4703
- Talonic is an AI-powered document structuring platform. It ingests unstructured documents (PDFs, scans, images, spreadsheets), discovers fields through semantic clustering, and produces structured datasets with per-cell provenance, confidence scores, and reasoning traces.
5302
+ Talonic ingests documents in 25+ formats (PDFs, scans, images, spreadsheets, emails, archives), discovers every data field through AI extraction and semantic clustering, and produces structured datasets with per-cell confidence scores, reasoning traces, and source provenance. It runs a single deployable stack with Postgres + pgvector, Anthropic Claude for extraction, and Mistral Document AI for OCR.
4704
5303
 
4705
- ## Documentation
5304
+ ## How It Works
4706
5305
 
4707
- - [API Documentation](https://talonic.com/docs): Complete REST API reference
4708
- - [Platform Guide](https://talonic.com/docs/platform): Product documentation and feature guide
4709
- - [OpenAPI Spec](https://talonic.com/docs/openapi.json): Machine-readable API specification
5306
+ 1. **Upload** \u2014 Drag files/folders into Inputs or ingest via API. ZIP archives unpack automatically. Files are deduplicated via SHA-256 hashing.
5307
+ 2. **Extract** \u2014 Each document goes through Document AI OCR (converts to Markdown), classification against a 529-type ontology, and AI field extraction (discovers every data point with confidence and source text).
5308
+ 3. **Build Schema** \u2014 Extracted fields resolve into the Field Registry (canonical names, semantic clusters, master instructions). Define a user template selecting the fields you need.
5309
+ 4. **Run Job** \u2014 A 4-phase pipeline fills every cell in a documents \xD7 fields grid. ~30% filled instantly from graph matches, ~70% from AI agents.
5310
+ 5. **Deliver** \u2014 Push approved data to webhooks, REST APIs, SFTP, email, or S3/R2 cloud storage.
4710
5311
 
4711
- ## API Quick Start
5312
+ ## Sources & Documents
4712
5313
 
4713
- Base URL: https://api.talonic.com
4714
- Auth: Bearer token (tlnc_ prefix)
5314
+ Supported formats across three processing paths:
5315
+ - **Text fast-path** (direct read): TXT, MD, HTML, XML, JSON, EML, CSV
5316
+ - **AI Vision** (multimodal): PNG, JPG, JPEG, GIF, WEBP
5317
+ - **OCR** (Mistral Document AI \u2192 Markdown): PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, XLSM, MSG, BMP
5318
+ - **Archives**: ZIP (recursive unpack)
4715
5319
 
4716
- Extract a document:
4717
- \`\`\`
4718
- curl -X POST https://api.talonic.com/v1/extract \\
4719
- -H "Authorization: Bearer tlnc_sk_live_..." \\
4720
- -F "file=@document.pdf" \\
4721
- -F 'schema={"vendor_name":"string","total":"number"}'
4722
- \`\`\`
5320
+ Upload methods: drag-and-drop UI, folder upload (preserves file paths), API upload (single, batch up to 200 files, or archive up to 500 MB). Batch mode available at 50% cost with 48-hour delivery window.
5321
+
5322
+ Every document is classified into a canonical type from the 529-type ontology (e.g., "Employment Contract", "Invoice", "Bill of Lading"). Classification is language-agnostic \u2014 a German Arbeitsvertrag maps to the same type as an English Employment Contract. Unresolvable documents get "Unclassified Document".
5323
+
5324
+ Document detail tabs: Raw Extraction (every field with confidence), Resolved Data (mapped to registry), Processing Log (per-stage timing), Original File.
5325
+
5326
+ ## Field Registry
5327
+
5328
+ The unified knowledge graph of all canonical fields, growing smarter with every document processed.
5329
+
5330
+ - **Tier 1 (Core)**: Universal fields across many document types. Most reliable.
5331
+ - **Tier 2 (Established)**: Promoted from Tier 3 after frequency thresholds. Production-ready.
5332
+ - **Tier 3 (Emerging)**: Newly discovered from a few documents. May promote as more data arrives.
5333
+
5334
+ Fields with similar meanings cluster automatically via AI embeddings (e.g., "Vendor Name", "Supplier Name", "Company Name" \u2192 same cluster). Master instructions are AI-synthesized extraction directives that improve accuracy over time.
5335
+
5336
+ ## Schemas
5337
+
5338
+ Two types: **Generated schemas** (auto-created per document type from Tier 1+2 fields) and **User templates** (user-defined output structures).
5339
+
5340
+ Template workflow: name it \u2192 add fields (display name, data type, extraction instructions) \u2192 map to registry (exact/semantic/composite matching) \u2192 add reference tables \u2192 publish an immutable version.
5341
+
5342
+ Field features: format constraints (regex validation with empty/flag/constant fallback), modifiers (date/number format, alias mapping, max_length), bypass strategies (constant, generator, reference lookup \u2014 skip LLM), capture submoves (match \u2192 compute \u2192 reason), output name remapping.
5343
+
5344
+ Versioning: Live (published, read-only), Workshop (mutable draft), Version History (timeline with diff). Test extraction compares draft vs. live results before publishing.
5345
+
5346
+ ## Extraction Jobs (Runs)
5347
+
5348
+ A job applies a schema to documents, producing a grid (rows = documents, columns = fields). Navigate to Structuring \u2192 Runs \u2192 New.
5349
+
5350
+ **4-phase pipeline:**
5351
+ 1. **Resolve** \u2014 ~30% of cells in seconds. Graph matches, fuzzy name matching, concept-synonym expansion, 3-tier reference lookup (normalize \u2192 fuzzy \u2192 AI), description scan. No AI calls (except rare Haiku fallback). Values normalized: dates \u2192 YYYY/MM/DD, numbers \u2192 2 decimal places.
5352
+ 2. **Agent** \u2014 AI reviews gap patterns and produces typed strategy per field: compute (formula from grid values), transfer (copy from equivalent field), extract (re-read document with instructions, 5 concurrent), skip (with reasoning). Fields with manual instructions are always extracted, never skipped.
5353
+ 3. **Validation** \u2014 Cross-field sanity checks: date_sanity, amount_mismatch, lookup_failed, low_confidence_outlier, unexpected_empty. Flags are informational only \u2014 never block output.
5354
+ 4. **Re-read** \u2014 Context-aware gap filling. For each empty/low-confidence cell, AI re-reads the original document with field instruction + full grid context. Respects the confidence gate: cells \u2265 0.7 confidence are permanently protected.
5355
+
5356
+ Per-cell provenance: confidence (0.0\u20131.0), resolution_type (graph_match | agent_derived | source_reread | unresolved), phase (1\u20134), reasoning trace, source reference (document, page, field).
4723
5357
 
4724
- ## Key Endpoints
5358
+ ## Cases & Document Linking
4725
5359
 
4726
- - POST /v1/extract \u2014 Extract structured data from a document
4727
- - GET /v1/documents \u2014 List and manage documents
4728
- - GET /v1/extractions \u2014 Query extraction results
4729
- - POST /v1/schemas \u2014 Create reusable extraction schemas
4730
- - GET /v1/jobs \u2014 Track async extraction jobs
4731
- - POST /v1/sources \u2014 Manage document sources with API keys
5360
+ Registry fields can be link keys: Identity (company/person names), Transaction (contract/PO/invoice numbers), Reference (project codes, cost centers). The linking pipeline normalizes values and builds a bipartite graph of documents \u2194 entities.
4732
5361
 
4733
- ## Platform Features
5362
+ A **case** = 2+ documents connected through transaction/reference entities. An **entity group** = 2+ documents connected through identity-only entities. High-frequency entities (>30% of documents) are auto-excluded from case formation.
4734
5363
 
4735
- - 25+ file format support (PDF, DOCX, images, spreadsheets, archives)
4736
- - Field Registry: unified knowledge graph of canonical fields with tier system
4737
- - 4-phase extraction pipeline: Resolve \u2192 Agent \u2192 Validate \u2192 Re-read
4738
- - Document linking and case discovery through shared entities
4739
- - Validation checks, golden samples, and approval gates
4740
- - Export to webhooks, REST APIs, SFTP, email, cloud storage
4741
- - HMAC-SHA256 signed webhooks with retry policy
5364
+ Case detail: documents, shared entities, evidence chain, timeline, AI-generated narration. Document Graph provides a D3-force visual layout. Case templates auto-discovered after 3+ cases form.
4742
5365
 
4743
- ## Optional
5366
+ ## Smart Matching
4744
5367
 
4745
- - [API Documentation (Markdown)](https://talonic.com/docs/api.md)
4746
- - [Platform Guide (Markdown)](https://talonic.com/docs/platform.md)
5368
+ Upload CSV/Excel as reference datasets. Define field-to-field comparisons with weighted strategies: exact (case-insensitive), fuzzy (token-based with similarity threshold), date_range (configurable tolerance), numeric_range (percentage or absolute tolerance). AI can auto-suggest field mappings.
5369
+
5370
+ Results: top 5 candidates per document with confidence scores and per-field evidence breakdown.
5371
+
5372
+ ## Validation & Quality
5373
+
5374
+ - **Validation checks**: Schema-level rules (field format, value range, cross-field consistency, AI-proposed coherence). Run during Phase 3.
5375
+ - **Golden samples**: Manually-created reference datasets. Benchmark runs compare extraction vs. golden for per-field accuracy with AI judge verdicts.
5376
+ - **Approval gates**: Threshold-based auto-approve/flag (minimum confidence, validation pass rate, field coverage). Failed rows go to manual review queue.
5377
+
5378
+ ## Delivery
5379
+
5380
+ Destinations: Webhook (HMAC-SHA256 signed), REST API (configurable headers), SFTP, Email (attachments), S3/R2 (cloud storage).
5381
+
5382
+ Field mappings transform output fields to match destination format. Triggers: auto on approval (stage/push), scheduled (cron), or manual. Failed exports retry with exponential backoff.
5383
+
5384
+ Dialects control serialization: date_format, number_locale, CSV delimiter, null representation, boolean format, encoding (UTF-8, UTF-8-BOM, ISO-8859-1).
5385
+
5386
+ ## Search & Navigation
5387
+
5388
+ **Omnisearch** (Cmd+K / Ctrl+K): searches across documents, extracted values, field names, schema names, and sources simultaneously.
5389
+
5390
+ Document filters: field-value conditions with autocomplete, comparison operators (eq, contains, gt, between, is_empty), combinable. URL-serializable and saveable as presets.
5391
+
5392
+ Keyboard shortcuts: Cmd+K (search), Cmd+J (quick extract), Escape (close overlays).
5393
+
5394
+ ## Team & Settings
5395
+
5396
+ 4 roles: Viewer (read-only), Member (full CRUD), Admin (+ team management), Owner (+ billing, API keys, org settings). New members auto-match by email domain with pending approval.
5397
+
5398
+ Usage & Registry: per-feature cost breakdown, daily cost chart, call log with model/tokens/cost. Admin master view for cross-tenant stats.
5399
+
5400
+ ## API
5401
+
5402
+ Base URL: \`https://api.talonic.com\`. Auth: \`Authorization: Bearer tlnc_...\` (SHA-256 hashed, shown once at creation). Scopes: extract, read, write.
5403
+
5404
+ Key endpoints:
5405
+ - POST /v1/extract \u2014 Synchronous/async document extraction (\`include_markdown=true\` returns OCR text, \`processing_mode=batch\` for 50% cost)
5406
+ - GET /v1/documents \u2014 List with cursor pagination; GET /v1/documents/:id/markdown for OCR text
5407
+ - GET /v1/extractions \u2014 Query results and field corrections
5408
+ - POST /v1/schemas \u2014 Create/manage extraction schemas
5409
+ - GET /v1/jobs \u2014 Track async jobs and results; N-Shot comparisons, overrides, judge decisions
5410
+ - POST /v1/sources \u2014 Manage API sources and document ingest
5411
+ - POST /v1/webhooks \u2014 Configure webhook endpoints
5412
+ - /v1/resolutions \u2014 Resolution runs: list, create, get, execute, delete, results
5413
+ - /v1/linking \u2014 Link keys, document links, entity graph, classify, backfill, document-case map
5414
+ - /v1/schema-graph \u2014 Schema classes, versions, diffs (approve/reject), edges, aliases, visualize
5415
+ - /v1/structuring \u2014 Validation checks CRUD, approval gates CRUD with rules, result checks, pending approvals, approve/reject, delivery trigger
5416
+ - /v1/telemetry \u2014 Per-schema and per-run summaries, trends, field-level breakdowns
5417
+ - /v1/validation \u2014 Golden samples (list, get, delete), validation runs (list, create, get, delete, results)
5418
+ - /v1/credits \u2014 Balance, history, usage summary, daily usage, per-request usage log
5419
+ - /v1/cases \u2014 Status updates, edges, edge confirm/reject, split/merge, completeness, pin/remove documents
5420
+ - /v1/batches \u2014 Sync with provider, cancel
5421
+ - /v1/matching \u2014 Smart run, AI resolve, strategies CRUD, run results/progress, review
5422
+ - /v1/review \u2014 Assign, stats
5423
+ - /v1/quality \u2014 Ground truth entries CRUD, benchmark results, benchmark comparison
5424
+ - /v1/reference-data \u2014 JSON upload (POST create)
5425
+
5426
+ Webhook events: extraction.completed, job.completed, export.completed, validation.completed. All HMAC-SHA256 signed with retry on failure.
5427
+
5428
+ ## Agent
5429
+
5430
+ The embedded AI assistant accessible from any page. Two modes:
5431
+ - **Chat mode** \u2014 Ask questions about the platform, your documents, extraction results, schemas, or workflows. Grounded in platform documentation.
5432
+ - **Planning mode** \u2014 Request actions (create schemas, run jobs, configure exports). The agent builds a plan, confirms with you, then executes.
5433
+
5434
+ Document upload flow: Cmd+J or the upload button opens quick extract. Drop a file, select a schema (or let AI discover fields), and get structured results.
5435
+
5436
+ ## Documentation
5437
+
5438
+ - [API Documentation](https://talonic.com/docs): Complete REST API reference
5439
+ - [Platform Guide](https://talonic.com/docs/platform): Product documentation and feature guide
5440
+ - [OpenAPI Spec](https://talonic.com/docs/openapi.json): Machine-readable API specification
4747
5441
  `;
4748
5442
  var LLMS_FULL_TXT_HEADER = `# Talonic \u2014 Full Documentation
4749
5443