@talonic/docs 0.20.9 → 0.20.10

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.
Files changed (2) hide show
  1. package/dist/content.js +139 -33
  2. package/package.json +1 -1
package/dist/content.js CHANGED
@@ -1602,6 +1602,10 @@ var sections5 = [
1602
1602
  "**Add reference tables** \u2014 For code fields (e.g., country name → ISO code), upload key-value pairs.",
1603
1603
  "**Publish** \u2014 Create an immutable version snapshot ready for job execution."
1604
1604
  ]
1605
+ },
1606
+ {
1607
+ type: "paragraph",
1608
+ text: "Most teams start by importing an existing spreadsheet or CSV as a template baseline, then refine field types and add extraction instructions. Once you publish a version, it becomes immutable and available for job execution \u2014 any further changes happen in a new **Workshop** draft, keeping your production schema stable while you iterate."
1605
1609
  }
1606
1610
  ],
1607
1611
  related: [
@@ -1678,6 +1682,10 @@ var sections5 = [
1678
1682
  }
1679
1683
  ]
1680
1684
  },
1685
+ {
1686
+ type: "paragraph",
1687
+ text: "When configuring a field, start with the basics \u2014 name, type, and registry mapping \u2014 then layer on advanced features as needed. For example, add a **format constraint** to enforce a date pattern, attach a **reference table** for code lookups, or define **capture submoves** to control the exact extraction sequence. Features compose independently, so you can mix and match without conflicts."
1688
+ },
1681
1689
  {
1682
1690
  type: "callout",
1683
1691
  text: "For the complete JSON Schema specification with all features, see the [Full Schema Reference](/docs/platform/schema-features) in the Platform Guide."
@@ -1740,6 +1748,10 @@ var sections5 = [
1740
1748
  description: "No match found \u2014 needs manual extraction instructions."
1741
1749
  }
1742
1750
  ]
1751
+ },
1752
+ {
1753
+ type: "paragraph",
1754
+ text: "When you add a field to a template, the system automatically attempts to match it against the **Field Registry**. Exact name matches are applied instantly, while semantic and composite matches appear as suggestions for your confirmation. If no match is found, the field is marked **Unmapped** and you should provide a manual extraction instruction so the AI knows how to extract that value from your documents."
1743
1755
  }
1744
1756
  ],
1745
1757
  related: [
@@ -1791,6 +1803,10 @@ var sections5 = [
1791
1803
  }
1792
1804
  ]
1793
1805
  },
1806
+ {
1807
+ type: "paragraph",
1808
+ text: "To set up a reference table, upload a CSV or manually enter key-value pairs where the **key** is the code you want in your output and the **value** is the human-readable label found in documents. During extraction, the system tries each tier in order \u2014 most values resolve instantly at Tier 1, so keeping your labels clean and consistent dramatically improves both speed and accuracy."
1809
+ },
1794
1810
  {
1795
1811
  type: "callout",
1796
1812
  text: "Reference table quality directly determines lookup accuracy. A properly loaded table produces 90-100% accurate results within a single run."
@@ -1829,6 +1845,10 @@ var sections5 = [
1829
1845
  {
1830
1846
  type: "paragraph",
1831
1847
  text: "Templates support a workshop system: **Live** (current published version, read-only), **Workshop** (mutable draft for editing), and **Version History** (timeline with diff summaries). When promoting a draft, the system detects breaking changes (field removals, type changes) and warns you."
1848
+ },
1849
+ {
1850
+ type: "paragraph",
1851
+ text: "Start by editing fields in the **Workshop** draft, then use **Test Extraction** to compare draft results against the live version before publishing. The **Version History** timeline lets you review diff summaries between any two versions, making it easy to trace when a field was added, renamed, or removed and understand the impact on downstream jobs."
1832
1852
  }
1833
1853
  ],
1834
1854
  related: [
@@ -1858,6 +1878,10 @@ var sections5 = [
1858
1878
  {
1859
1879
  type: "paragraph",
1860
1880
  text: "Before publishing a draft, run a test extraction to compare draft vs. live results side-by-side. Select a few documents, run the test, and see exactly how your changes affect output."
1881
+ },
1882
+ {
1883
+ type: "paragraph",
1884
+ text: "After running a test, you will see a comparison grid highlighting cells that changed between the draft and live versions. Focus on fields you modified \u2014 new fields, updated instructions, or changed reference tables \u2014 to verify they produce the expected values. This workflow catches regressions before they reach production, so you can iterate on your schema with confidence."
1861
1885
  }
1862
1886
  ],
1863
1887
  related: [
@@ -1923,6 +1947,10 @@ var sections5 = [
1923
1947
  description: "Output file encoding: UTF-8 (default), UTF-8-BOM, ISO-8859-1, etc."
1924
1948
  }
1925
1949
  ]
1950
+ },
1951
+ {
1952
+ type: "paragraph",
1953
+ text: "When working with international data, configure the dialect to match your downstream system requirements. For example, set **number_locale** to `fr-FR` for European comma-decimal formatting, switch the **delimiter** to semicolon for CSV compatibility, and choose **UTF-8-BOM** encoding if your data will be opened in Excel. Creating a shared dialect and reusing it across schemas ensures consistent formatting across all your exports."
1926
1954
  }
1927
1955
  ],
1928
1956
  related: [
@@ -1986,6 +2014,10 @@ var sections5 = [
1986
2014
  }
1987
2015
  ]
1988
2016
  },
2017
+ {
2018
+ type: "paragraph",
2019
+ text: 'Use bypass strategies for fields whose values are known ahead of time or can be derived without reading the document. For example, set a **constant** of `"USD"` for a currency field that is always the same, or use a **generator** to produce a deterministic ID for each row. Fields with bypass strategies skip the AI extraction phase entirely, reducing processing time and credit usage.'
2020
+ },
1989
2021
  {
1990
2022
  type: "callout",
1991
2023
  text: "When a `generator` strategy fails to produce a value, the field falls through to LLM extraction as a safety net. Strategy values are normalized via generator mappings in Phase 4 of the pipeline."
@@ -2122,6 +2154,10 @@ var sections6 = [
2122
2154
  type: "paragraph",
2123
2155
  text: "Every job runs through four phases. Each fills more cells in the output grid, reducing the problem space for the next. Results are visible as each phase completes."
2124
2156
  },
2157
+ {
2158
+ type: "paragraph",
2159
+ text: "Each phase builds on the previous one, progressively filling the output grid. **Phase 1** resolves ~30% of cells instantly using graph matches and lookups. **Phase 2** deploys an AI agent to fill remaining gaps. **Phase 3** runs cross-field validation checks, and **Phase 4** performs targeted re-reads for empty or low-confidence cells. You can monitor fill rate in real time as each phase completes."
2160
+ },
2125
2161
  {
2126
2162
  type: "ui-excerpt",
2127
2163
  id: "job-detail-phase-timeline",
@@ -2228,6 +2264,10 @@ var sections6 = [
2228
2264
  type: "paragraph",
2229
2265
  text: "An AI agent reviews the grid's gap patterns and produces a typed strategy:"
2230
2266
  },
2267
+ {
2268
+ type: "paragraph",
2269
+ text: "The agent analyzes which cells are still empty after Phase 1 and selects the most efficient action for each. Simple calculations like `Total = Unit Price x Quantity` use the **compute** strategy without any AI calls, while truly missing data triggers an **extract** that re-reads the source document with targeted instructions. You can inspect the agent's chosen strategy for every field on the **Strategy Panel** of the job detail page."
2270
+ },
2231
2271
  {
2232
2272
  type: "ui-excerpt",
2233
2273
  id: "job-detail-agent-strategy",
@@ -2301,6 +2341,10 @@ var sections6 = [
2301
2341
  type: "paragraph",
2302
2342
  text: "Cross-field sanity checks. Flags are **informational only** \u2014 they never block output but help you prioritize review:"
2303
2343
  },
2344
+ {
2345
+ type: "paragraph",
2346
+ text: "After Phase 3 completes, flagged cells appear with warning indicators in the results grid. Use the **Flagged** filter to see only rows that need attention \u2014 for example, an **amount_mismatch** flag suggests you double-check a total that does not align with its component values. Addressing flagged cells first is the most efficient way to review large extraction runs."
2347
+ },
2304
2348
  {
2305
2349
  type: "param-table",
2306
2350
  title: "Validation flags",
@@ -2367,6 +2411,10 @@ var sections6 = [
2367
2411
  type: "paragraph",
2368
2412
  text: "Context-aware gap filling. For each empty cell or low-confidence value, AI re-reads the original document with the field instruction and full grid context. This focused approach often finds values missed in earlier phases."
2369
2413
  },
2414
+ {
2415
+ type: "paragraph",
2416
+ text: "Because Phase 4 has access to the full grid context \u2014 all values already resolved in earlier phases \u2014 it can use surrounding data as clues. For example, if a contract start date was resolved in Phase 1 but the end date is still empty, Phase 4 re-reads the document knowing the start date, which helps the AI locate the corresponding end date more accurately."
2417
+ },
2370
2418
  {
2371
2419
  type: "callout",
2372
2420
  text: "Phase 4 respects the **confidence gate**: it can only fill empty cells or upgrade cells below the confidence threshold. High-confidence values from Phase 1 are permanently protected."
@@ -2405,6 +2453,10 @@ var sections6 = [
2405
2453
  {
2406
2454
  type: "paragraph",
2407
2455
  text: "The job detail page provides: a **progress bar** with fill rate, a **phase timeline**, the **strategy panel** (agent actions), a **filter bar** (Show All / Clean / Flagged), and **CSV export** (clean or full with metadata)."
2456
+ },
2457
+ {
2458
+ type: "paragraph",
2459
+ text: "Start your review by switching to the **Flagged** filter to focus on cells that need attention \u2014 these are values with validation warnings, low confidence, or format mismatches. Click any cell to see its full provenance, including which phase produced it and the reasoning trace. Once you are satisfied, export via **CSV** \u2014 choose the clean export for downstream systems or the full export with metadata for auditing."
2408
2460
  }
2409
2461
  ],
2410
2462
  related: [
@@ -2441,6 +2493,10 @@ var sections6 = [
2441
2493
  type: "paragraph",
2442
2494
  text: "Every cell carries detailed provenance. Hover a cell for confidence; click for full detail."
2443
2495
  },
2496
+ {
2497
+ type: "paragraph",
2498
+ text: "When reviewing results, hover over any cell to see its **confidence score** at a glance. Click the cell to expand the full provenance panel, which shows the **resolution type**, the **phase** that produced the value, and a human-readable **reasoning trace** explaining how the value was derived. Use this information to quickly identify which cells need manual review and which can be trusted as-is."
2499
+ },
2444
2500
  {
2445
2501
  type: "param-table",
2446
2502
  title: "Cell provenance fields",
@@ -2511,6 +2567,10 @@ var sections6 = [
2511
2567
  {
2512
2568
  type: "paragraph",
2513
2569
  text: "Click any cell to edit its value. Corrections are logged with the original value, timestamp, and user. Choose a propagation scope: `this_document_only` or `all_similar` (same field + method + source field across all documents). Corrections feed back as training signals for future runs."
2570
+ },
2571
+ {
2572
+ type: "paragraph",
2573
+ text: "When correcting a value, consider using **all_similar** propagation if the same mistake appears across multiple documents \u2014 for example, a reference table code that was consistently mapped to the wrong label. This applies your fix to every document in the run that matched the same way, saving you from correcting each cell individually. The system learns from these corrections, so the same error is less likely to recur in future jobs."
2514
2574
  }
2515
2575
  ],
2516
2576
  related: [
@@ -7085,6 +7145,7 @@ var sections22 = [
7085
7145
  }
7086
7146
  }`
7087
7147
  },
7148
+ { type: "paragraph", text: "Most integrations call `POST /v1/jobs` immediately after defining or updating a schema via the schemas API. Once created, poll `GET /v1/jobs/:id` every 2-5 seconds and watch for `status` transitioning to `complete`. Pair with `GET /v1/jobs/:id/results` to retrieve the structured output rows as soon as the job finishes." },
7088
7149
  { type: "heading", level: 2, id: "create-job-errors", text: "Errors" },
7089
7150
  {
7090
7151
  type: "param-table",
@@ -7172,6 +7233,7 @@ var sections22 = [
7172
7233
  }
7173
7234
  }`
7174
7235
  },
7236
+ { type: "paragraph", text: "This endpoint is typically used in a polling loop after `POST /v1/jobs`. Watch `current_phase` to track pipeline progression through `phase_1_resolve`, `phase_2_execute`, `phase_3_resolve`, and `phase_4_transform`. The `grid_stats.fill_rate` value increases as each phase completes, giving you a real-time quality signal before the job reaches `complete` status." },
7175
7237
  { type: "heading", level: 2, id: "get-job-errors", text: "Errors" },
7176
7238
  {
7177
7239
  type: "param-table",
@@ -7250,6 +7312,7 @@ var sections22 = [
7250
7312
  }
7251
7313
  }`
7252
7314
  },
7315
+ { type: "paragraph", text: "Pair this with `GET /v1/jobs/:id/results` to retrieve any rows that were processed before cancellation. The `completed_documents` field in the response tells you how many documents finished before the job was stopped, so you can decide whether the partial results are usable or if a new job is needed." },
7253
7316
  { type: "heading", level: 2, id: "cancel-job-errors", text: "Errors" },
7254
7317
  {
7255
7318
  type: "param-table",
@@ -7354,6 +7417,7 @@ var sections22 = [
7354
7417
  }
7355
7418
  }`
7356
7419
  },
7420
+ { type: "paragraph", text: "Returns one row per document with field values keyed by the schema field names you defined. Rows with `validation_flags` containing entries like `missing_required_field:<name>` or `format_mismatch:<name>` indicate Phase 4 detected data quality issues. Use the `confidence` score to prioritize which rows need manual review -- values below 0.8 typically warrant inspection." },
7357
7421
  { type: "heading", level: 2, id: "get-job-results-errors", text: "Errors" },
7358
7422
  {
7359
7423
  type: "param-table",
@@ -8002,7 +8066,8 @@ var sections24 = [
8002
8066
  { name: "404", type: "not_found", description: "No field with the given fieldId exists for your workspace." },
8003
8067
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
8004
8068
  ]
8005
- }
8069
+ },
8070
+ { type: "paragraph", text: 'Pair this endpoint with the **field autocomplete** endpoint to build a two-step filter UI: first let the user select a field via `GET /fields/autocomplete`, then populate a dropdown with that field\'s distinct values from this endpoint. The `totalDistinct` count is useful for showing "N of M values" pagination hints.' }
8006
8071
  ],
8007
8072
  related: [
8008
8073
  { label: "Field Autocomplete", slug: "field-autocomplete" },
@@ -8104,7 +8169,8 @@ var sections24 = [
8104
8169
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
8105
8170
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
8106
8171
  ]
8107
- }
8172
+ },
8173
+ { type: "paragraph", text: "Build conditions programmatically by first calling `GET /fields/autocomplete` to resolve field IDs, then `GET /fields/:fieldId/values` to populate value pickers. The response includes the full `fieldValues` map per document, so you can render result tables without additional per-document fetches." }
8108
8174
  ],
8109
8175
  related: [
8110
8176
  { label: "Field Autocomplete", slug: "field-autocomplete" },
@@ -8188,7 +8254,8 @@ var sections24 = [
8188
8254
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
8189
8255
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
8190
8256
  ]
8191
- }
8257
+ },
8258
+ { type: "paragraph", text: "Returns categorized results across **documents**, **fieldMatches**, **sources**, **schemas**, and **fields** in a single call, so a Cmd+K palette can render grouped sections without multiple requests. Use the `limit` parameter to cap results per category and keep response times fast for interactive search." }
8192
8259
  ],
8193
8260
  related: [
8194
8261
  { label: "Filter Documents", slug: "filter-documents" },
@@ -8336,7 +8403,8 @@ var sections24 = [
8336
8403
  { name: "404", type: "not_found", description: "No saved filter with this ID exists." },
8337
8404
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
8338
8405
  ]
8339
- }
8406
+ },
8407
+ { type: "paragraph", text: "Saved filters work as reusable presets for `POST /v1/documents/filter`. Store a complex combination of conditions, search text, and sort order once, then load it by ID and pass the saved `conditions` array directly to the filter endpoint. All team members in the organization can list and use saved filters." }
8340
8408
  ],
8341
8409
  related: [
8342
8410
  { label: "Filter Documents", slug: "filter-documents" }
@@ -8354,7 +8422,8 @@ var sections24 = [
8354
8422
  seoTitle: "Document Counts \u2014 Talonic Docs",
8355
8423
  description: "Query document counts grouped by filter conditions and source connections. Useful for building faceted navigation and dashboard widgets.",
8356
8424
  content: [
8357
- { type: "paragraph", text: "The document counts endpoint returns aggregate counts of documents matching filter conditions, grouped by source connection. Use it to power faceted navigation UIs and dashboard summary widgets without fetching full document lists." }
8425
+ { type: "paragraph", text: "The document counts endpoint returns aggregate counts of documents matching filter conditions, grouped by source connection. Use it to power faceted navigation UIs and dashboard summary widgets without fetching full document lists." },
8426
+ { type: "paragraph", text: "Call this before `POST /v1/documents/filter` to preview how many documents match your conditions without fetching the full result set. The response groups counts by **source connection**, so you can render per-source facets in a sidebar alongside the main document list." }
8358
8427
  ],
8359
8428
  related: [
8360
8429
  { label: "Filter Documents", slug: "filter-documents" }
@@ -8405,7 +8474,8 @@ var sections24 = [
8405
8474
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
8406
8475
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
8407
8476
  ]
8408
- }
8477
+ },
8478
+ { type: "paragraph", text: "In a typical bulk-ingestion workflow, call `POST /v1/extract` for each file, wait for all `document.extraction.completed` webhooks, then trigger `POST /filter/materialize` once. After the backfill completes, all filter and omnisearch endpoints will reflect the newly ingested data." }
8409
8479
  ],
8410
8480
  related: [
8411
8481
  { label: "Filter Documents", slug: "filter-documents" }
@@ -8423,7 +8493,8 @@ var sections24 = [
8423
8493
  seoTitle: "Materialized Index \u2014 Talonic Docs",
8424
8494
  description: "The materialized field value index powers fast filter queries. Rebuild it after bulk document ingestion using the materialize endpoint.",
8425
8495
  content: [
8426
- { type: "paragraph", text: "The materialized index pre-computes and stores extracted field values for every document, enabling sub-second filter queries even on large workspaces. After bulk ingestion or schema changes, trigger a rebuild via the materialize endpoint to ensure the index stays current." }
8496
+ { type: "paragraph", text: "The materialized index pre-computes and stores extracted field values for every document, enabling sub-second filter queries even on large workspaces. After bulk ingestion or schema changes, trigger a rebuild via the materialize endpoint to ensure the index stays current." },
8497
+ { type: "paragraph", text: "Both `POST /v1/documents/filter` and `GET /v1/search` read from this materialized index. If filter results appear stale or miss recently processed documents, call `POST /filter/materialize` to rebuild. For single-document uploads the index updates automatically, so manual rebuilds are only needed after bulk operations." }
8427
8498
  ],
8428
8499
  related: [
8429
8500
  { label: "Materialize", slug: "document-counts" }
@@ -8757,6 +8828,7 @@ var sections26 = [
8757
8828
  }
8758
8829
  }`
8759
8830
  },
8831
+ { type: "paragraph", text: "After creating a resolution, call `POST /v1/resolutions/{id}/execute` to start the pipeline. The typical workflow is: create a job via `POST /v1/jobs`, wait for `complete` status, then create and execute a resolution against the job's `source_run_id`. Each resolution captures its own **policy and dialect snapshots**, so you can re-run with different configurations without affecting previous results." },
8760
8832
  { type: "heading", level: 2, id: "create-resolution-errors", text: "Errors" },
8761
8833
  {
8762
8834
  type: "param-table",
@@ -8830,6 +8902,7 @@ var sections26 = [
8830
8902
  }
8831
8903
  }`
8832
8904
  },
8905
+ { type: "paragraph", text: "This endpoint is typically used in a polling loop after calling `POST /v1/resolutions/{id}/execute`. Watch for `status` transitioning from `running` to `completed` or `failed`. Once `completed`, use `GET /v1/resolutions/{id}/results` to inspect per-field resolved values and the `resolution_step` that produced each canonical mapping." },
8833
8906
  { type: "heading", level: 2, id: "get-resolution-errors", text: "Errors" },
8834
8907
  {
8835
8908
  type: "param-table",
@@ -8904,6 +8977,7 @@ var sections26 = [
8904
8977
  ]
8905
8978
  }`
8906
8979
  },
8980
+ { type: "paragraph", text: "Use the `resolution_step` field to understand how each value was normalized: `lookup` indicates a direct reference table match, `transfer` means the value was carried from the field registry, and `compute` means a deterministic formula produced the result. Fields where `resolved_value` is `null` were not matched by any strategy and retain their raw extracted value -- consider adding those values to your lookup tables for future runs." },
8907
8981
  { type: "heading", level: 2, id: "get-resolution-results-errors", text: "Errors" },
8908
8982
  {
8909
8983
  type: "param-table",
@@ -8976,6 +9050,7 @@ var sections26 = [
8976
9050
  }
8977
9051
  }`
8978
9052
  },
9053
+ { type: "paragraph", text: 'The standard workflow is `POST /v1/resolutions` to create, then `POST /v1/resolutions/{id}/execute` to start processing. The endpoint returns immediately with `status: "running"` -- poll `GET /v1/resolutions/{id}` to detect completion. Deterministic lookups complete in seconds; runs that trigger the LLM fallback for ambiguous values take 1-5 minutes depending on the number of unresolved fields.' },
8979
9054
  { type: "heading", level: 2, id: "execute-resolution-errors", text: "Errors" },
8980
9055
  {
8981
9056
  type: "param-table",
@@ -9029,6 +9104,7 @@ var sections26 = [
9029
9104
  "deleted": true
9030
9105
  }`
9031
9106
  },
9107
+ { type: "paragraph", text: "Common usage is to delete `failed` resolution runs before retrying with a new `POST /v1/resolutions`. The source job run and its extracted data are completely unaffected by this operation, so you can safely clean up resolution experiments without losing upstream results." },
9032
9108
  { type: "heading", level: 2, id: "cancel-resolution-errors", text: "Errors" },
9033
9109
  {
9034
9110
  type: "param-table",
@@ -9856,6 +9932,7 @@ var sections28 = [
9856
9932
  ]
9857
9933
  }`
9858
9934
  },
9935
+ { type: "paragraph", text: 'Most integrations start with `GET /v1/jobs/runs/{runId}/nshot/summary` to check the overall `agreement_rate`, then drill into this endpoint to find `status: "red"` and `status: "yellow"` comparisons that need attention. Use the `override` and `judgement` fields to track which comparisons have already been reviewed and which still need a decision.' },
9859
9936
  { type: "heading", level: 2, id: "nshot-list-shots-errors", text: "Errors" },
9860
9937
  {
9861
9938
  type: "param-table",
@@ -9953,6 +10030,7 @@ var sections28 = [
9953
10030
  }
9954
10031
  }`
9955
10032
  },
10033
+ { type: "paragraph", text: "This endpoint is typically called after identifying a problematic comparison in the `GET /v1/jobs/runs/{runId}/nshot/comparisons` list. Inspect the `values` array to see what each shot extracted, then check the `judgement` object for the LLM's recommendation. If `judgement.accepted` is `null`, you can submit a decision via `POST /v1/jobs/runs/{runId}/nshot/judge-decision`." },
9956
10034
  { type: "heading", level: 2, id: "nshot-compare-errors", text: "Errors" },
9957
10035
  {
9958
10036
  type: "param-table",
@@ -10055,6 +10133,7 @@ var sections28 = [
10055
10133
  }
10056
10134
  }`
10057
10135
  },
10136
+ { type: "paragraph", text: "Use this when the **majority value** from the shots is incorrect and a different shot produced the right extraction. The `override` record captures a full audit trail including `from_value`, `to_value`, and `overridden_at`. Pair with the judge decision endpoint when you want to accept LLM recommendations programmatically instead of selecting shots manually." },
10058
10137
  { type: "heading", level: 2, id: "nshot-select-errors", text: "Errors" },
10059
10138
  {
10060
10139
  type: "param-table",
@@ -10161,6 +10240,7 @@ var sections28 = [
10161
10240
  }
10162
10241
  }`
10163
10242
  },
10243
+ { type: "paragraph", text: 'This endpoint fits into a review workflow where you batch-process LLM judge recommendations. Retrieve comparisons with `judgement.accepted: null` from the comparisons list, then iterate through them calling this endpoint with `accepted: true` or `false`. Accepted decisions automatically create an override with `actor_id: "judge"`, so no separate override call is needed.' },
10164
10244
  { type: "heading", level: 2, id: "nshot-judge-decision-errors", text: "Errors" },
10165
10245
  {
10166
10246
  type: "param-table",
@@ -10324,7 +10404,8 @@ var sections29 = [
10324
10404
  { name: "404", type: "not_found", description: "No schema class with this ID exists for your organization." },
10325
10405
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
10326
10406
  ]
10327
- }
10407
+ },
10408
+ { type: "paragraph", text: "Use this endpoint to inspect a class before reviewing its pending diffs via `GET /v1/schema-graph/diffs?schema_class_id={id}`. The `current_version_id` tells you which version is live; follow the `links.versions` URL to compare previous snapshots and understand how the class has evolved." }
10328
10409
  ],
10329
10410
  related: [
10330
10411
  { label: "List Classes", slug: "list-schema-graph-classes" },
@@ -10398,7 +10479,8 @@ var sections29 = [
10398
10479
  { name: "404", type: "not_found", description: "No schema class with this ID exists for your organization." },
10399
10480
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
10400
10481
  ]
10401
- }
10482
+ },
10483
+ { type: "paragraph", text: "Compare two versions by fetching them individually with `GET /v1/schema-graph/classes/{id}/versions/{version}` and diffing their `json_schema` and `field_ids` arrays. This is useful for auditing how a class evolved after a diff was approved, or for building a changelog UI that shows added and removed fields per version." }
10402
10484
  ],
10403
10485
  related: [
10404
10486
  { label: "Get Version", slug: "get-class-version" },
@@ -10466,7 +10548,8 @@ var sections29 = [
10466
10548
  { name: "404", type: "not_found", description: "No schema class with this ID exists for your organization, or the requested version number does not exist." },
10467
10549
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
10468
10550
  ]
10469
- }
10551
+ },
10552
+ { type: "paragraph", text: "The `json_schema` object is a valid JSON Schema you can use directly for client-side validation or code generation. The `field_ids` array maps each schema property back to its field registry entry, so you can cross-reference with `GET /v1/fields/{id}` for extraction instructions and occurrence statistics." }
10470
10553
  ],
10471
10554
  related: [
10472
10555
  { label: "List Versions", slug: "list-class-versions" }
@@ -10551,7 +10634,8 @@ var sections29 = [
10551
10634
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
10552
10635
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
10553
10636
  ]
10554
- }
10637
+ },
10638
+ { type: "paragraph", text: "Filter by `status=pending` to build a review queue for ontology changes. Inspect the `added_fields`, `removed_fields`, and `type_changes` arrays to assess impact, then call `POST /v1/schema-graph/diffs/{id}/approve` or `/reject` to action each diff. The `classification` field (`additive` vs `breaking`) helps prioritize which diffs need careful review." }
10555
10639
  ],
10556
10640
  related: [
10557
10641
  { label: "Approve Diff", slug: "approve-diff" },
@@ -10606,7 +10690,8 @@ var sections29 = [
10606
10690
  { name: "404", type: "not_found", description: "No diff with this ID exists for your organization." },
10607
10691
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
10608
10692
  ]
10609
- }
10693
+ },
10694
+ { type: "paragraph", text: "Approval is synchronous -- the new version is created and `current_version_id` is updated in the same request. After approving, call `GET /v1/schema-graph/classes/{id}/versions` to verify the new version appeared, or fetch the updated class via `GET /v1/schema-graph/classes/{id}` to confirm `current_version_id` advanced." }
10610
10695
  ],
10611
10696
  related: [
10612
10697
  { label: "List Diffs", slug: "list-schema-graph-diffs" },
@@ -10660,7 +10745,8 @@ var sections29 = [
10660
10745
  { name: "404", type: "not_found", description: "No diff with this ID exists for your organization." },
10661
10746
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
10662
10747
  ]
10663
- }
10748
+ },
10749
+ { type: "paragraph", text: 'Rejected diffs are retained for audit and appear with `review_status: "rejected"` when listing diffs. If the same field changes are needed later, the platform generates a new diff automatically during the next extraction cycle. Use rejection to discard noisy or incorrect field discoveries without advancing the class version.' }
10664
10750
  ],
10665
10751
  related: [
10666
10752
  { label: "List Diffs", slug: "list-schema-graph-diffs" },
@@ -10735,7 +10821,8 @@ var sections29 = [
10735
10821
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
10736
10822
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
10737
10823
  ]
10738
- }
10824
+ },
10825
+ { type: "paragraph", text: "Pair this with `GET /v1/schema-graph/classes` to build relationship maps between document types. High-weight edges (e.g. `weight > 0.7`) indicate strong field overlap -- useful for identifying document types that should share user schema fields or be linked in cases. Feed the results directly into `GET /v1/schema-graph/visualize` for a D3-ready graph payload." }
10739
10826
  ],
10740
10827
  related: [
10741
10828
  { label: "List Classes", slug: "list-schema-graph-classes" },
@@ -10799,7 +10886,8 @@ var sections29 = [
10799
10886
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
10800
10887
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
10801
10888
  ]
10802
- }
10889
+ },
10890
+ { type: "paragraph", text: 'Use this endpoint to audit how variant document type labels resolve to canonical classes. For example, if documents labelled "Bill" and "Tax Invoice" both map to the **Invoice** class, they will share the same `schema_class_id`. This is useful for understanding classification behavior and debugging misclassified documents.' }
10803
10891
  ],
10804
10892
  related: [
10805
10893
  { label: "List Classes", slug: "list-schema-graph-classes" }
@@ -10882,7 +10970,8 @@ var sections29 = [
10882
10970
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
10883
10971
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
10884
10972
  ]
10885
- }
10973
+ },
10974
+ { type: "paragraph", text: "The response is structured for direct consumption by D3.js force simulations, Cytoscape, or vis.js -- edge `source` and `target` fields reference node `id` values. Filter nodes client-side by `status` to exclude archived classes, and use edge `weight` to control link distance or opacity in your graph layout." }
10886
10975
  ],
10887
10976
  related: [
10888
10977
  { label: "Edges", slug: "list-schema-graph-edges" },
@@ -11088,7 +11177,8 @@ var sections30 = [
11088
11177
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
11089
11178
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
11090
11179
  ]
11091
- }
11180
+ },
11181
+ { type: "paragraph", text: "Newly created checks are automatically **active** and evaluate against all future structuring results. Pair this with `POST /v1/structuring/gates` and `POST /v1/structuring/gates/{id}/rules` to wire checks into an approval gate -- checks flag individual fields, while gate rules aggregate check outcomes to decide whether a result needs manual approval." }
11092
11182
  ],
11093
11183
  related: [
11094
11184
  { label: "List Checks", slug: "list-structuring-checks" },
@@ -11172,7 +11262,8 @@ var sections30 = [
11172
11262
  { name: "404", type: "not_found", description: "Validation check not found or does not belong to your organization." },
11173
11263
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
11174
11264
  ]
11175
- }
11265
+ },
11266
+ { type: "paragraph", text: "Use **PUT** to adjust thresholds (e.g. widening a `value_range` config) or to deactivate a check by setting `is_active` to `false` without deleting it. Historical check outcomes referencing this check are preserved regardless of updates or soft-deletion, so audit trails remain intact." }
11176
11267
  ],
11177
11268
  related: [
11178
11269
  { label: "List Checks", slug: "list-structuring-checks" },
@@ -11275,7 +11366,8 @@ var sections30 = [
11275
11366
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
11276
11367
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
11277
11368
  ]
11278
- }
11369
+ },
11370
+ { type: "paragraph", text: "Each gate embeds its active `rules` array, so you can inspect thresholds without a separate fetch. Use the `schema_id` query parameter to find which gates apply to a specific schema, then follow the `links.rules` URL to manage individual rules via `POST /v1/structuring/gates/{id}/rules`." }
11279
11371
  ],
11280
11372
  related: [
11281
11373
  { label: "Create Gate", slug: "create-structuring-gate" },
@@ -11367,7 +11459,8 @@ var sections30 = [
11367
11459
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
11368
11460
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
11369
11461
  ]
11370
- }
11462
+ },
11463
+ { type: "paragraph", text: "A gate starts with an empty `rules` array, which means all results auto-approve until you add rules. The typical setup sequence is: create the gate, then immediately call `POST /v1/structuring/gates/{id}/rules` to add a `min_confidence` rule with your desired threshold. Optionally set `destination_id` to route approved results directly to a delivery destination." }
11371
11464
  ],
11372
11465
  related: [
11373
11466
  { label: "List Gates", slug: "list-structuring-gates" },
@@ -11459,7 +11552,8 @@ var sections30 = [
11459
11552
  { name: "404", type: "not_found", description: "Approval gate not found or does not belong to your organization." },
11460
11553
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
11461
11554
  ]
11462
- }
11555
+ },
11556
+ { type: "paragraph", text: "The `rules` array is only populated on **GET** responses. After a **PUT** update, re-fetch with GET to confirm the current rule set. **DELETE** soft-deletes the gate by setting `is_active` to `false` -- pending approval items already queued by this gate remain in the queue and can still be actioned manually." }
11463
11557
  ],
11464
11558
  related: [
11465
11559
  { label: "List Gates", slug: "list-structuring-gates" },
@@ -11584,7 +11678,8 @@ var sections30 = [
11584
11678
  { name: "404", type: "not_found", description: "Approval gate or rule not found, or gate does not belong to your organization." },
11585
11679
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
11586
11680
  ]
11587
- }
11681
+ },
11682
+ { type: "paragraph", text: "Rules are evaluated in `sort_order` ascending -- if any rule fails, the result is flagged for manual approval via `GET /v1/structuring/approvals/pending`. A common setup is a `min_confidence` rule at `sort_order: 0` followed by a `validation_pass_rate` rule at `sort_order: 1`, so confidence is checked before validation pass rate." }
11588
11683
  ],
11589
11684
  related: [
11590
11685
  { label: "Create Gate", slug: "create-structuring-gate" },
@@ -11658,7 +11753,8 @@ var sections30 = [
11658
11753
  { name: "404", type: "not_found", description: "Structuring result not found or does not belong to your organization." },
11659
11754
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
11660
11755
  ]
11661
- }
11756
+ },
11757
+ { type: "paragraph", text: 'Check outcomes are computed automatically when a structuring result is produced -- no manual trigger is needed. Use the embedded `check.name` and `check.severity` fields to render pass/fail badges in a review UI. Failed checks with `severity: "error"` are the ones that cause results to appear in `GET /v1/structuring/approvals/pending`.' }
11662
11758
  ],
11663
11759
  related: [
11664
11760
  { label: "List Checks", slug: "list-structuring-checks" },
@@ -11729,7 +11825,8 @@ var sections30 = [
11729
11825
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
11730
11826
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
11731
11827
  ]
11732
- }
11828
+ },
11829
+ { type: "paragraph", text: "Each item links a structuring result to the specific check that failed, so a single result can appear multiple times if it failed multiple checks. Use the `result_id` to group items by result, then call `POST /v1/structuring/approvals/{id}/approve` or `/reject` to action each one. Approving a result clears all its pending items and triggers the gate's `on_approve` action." }
11733
11830
  ],
11734
11831
  related: [
11735
11832
  { label: "Approve / Reject", slug: "approve-reject-result" },
@@ -11796,7 +11893,8 @@ var sections30 = [
11796
11893
  { name: "404", type: "not_found", description: "Structuring result or approval gate not found, or they do not belong to your organization." },
11797
11894
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
11798
11895
  ]
11799
- }
11896
+ },
11897
+ { type: "paragraph", text: "After approving, the gate's `on_approve` action fires -- typically emitting a delivery signal. To batch-approve an entire run's results at once, iterate the pending approvals from `GET /v1/structuring/approvals/pending`, approve each individually, then call `POST /v1/structuring/delivery/{runId}` to trigger delivery for the full run." }
11800
11898
  ],
11801
11899
  related: [
11802
11900
  { label: "Pending Approvals", slug: "pending-approvals" },
@@ -11853,7 +11951,8 @@ var sections30 = [
11853
11951
  { name: "404", type: "not_found", description: "Job run not found or does not belong to your organization." },
11854
11952
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
11855
11953
  ]
11856
- }
11954
+ },
11955
+ { type: "paragraph", text: "This endpoint is idempotent per result -- each approved result generates a deterministic idempotency key, so calling it multiple times on the same run does not produce duplicate deliveries. The typical workflow is: approve results individually via `POST /v1/structuring/approvals/{id}/approve`, then trigger delivery for the entire run once all reviews are complete." }
11857
11956
  ],
11858
11957
  related: [
11859
11958
  { label: "Approve / Reject", slug: "approve-reject-result" }
@@ -16644,7 +16743,8 @@ var sections39 = [
16644
16743
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
16645
16744
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
16646
16745
  ]
16647
- }
16746
+ },
16747
+ { type: "paragraph", text: "Most integrations poll this endpoint on a schedule to detect new items, then call `GET /v1/review/:id` to fetch full detail before rendering a review UI. Pair with `GET /v1/review/stats` to monitor queue depth and set alerting thresholds on the **pending** count." }
16648
16748
  ],
16649
16749
  related: [
16650
16750
  { label: "Review Stats", slug: "review-stats" },
@@ -16701,7 +16801,8 @@ var sections39 = [
16701
16801
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
16702
16802
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
16703
16803
  ]
16704
- }
16804
+ },
16805
+ { type: "paragraph", text: "This endpoint is typically called on a dashboard polling loop to drive queue-depth indicators. Pair it with `GET /v1/review` filtered by `status=pending` to fetch the actual items once the **pending** count crosses your alerting threshold." }
16705
16806
  ],
16706
16807
  related: [
16707
16808
  { label: "List Review Items", slug: "list-review-items" },
@@ -16782,7 +16883,8 @@ var sections39 = [
16782
16883
  { name: "404", type: "not_found", description: "Review record not found or does not belong to your organization." },
16783
16884
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
16784
16885
  ]
16785
- }
16886
+ },
16887
+ { type: "paragraph", text: "Use the `low_confidence_fields` array to highlight problematic cells in your review UI before calling `POST /v1/review/:id/action`. The `field_decisions` object persists per-field overrides, so you can build interfaces where reviewers correct individual values and submit the decision in one step." }
16786
16888
  ],
16787
16889
  related: [
16788
16890
  { label: "Review Action", slug: "review-action" },
@@ -16866,7 +16968,8 @@ var sections39 = [
16866
16968
  { name: "404", type: "not_found", description: "Review record not found or does not belong to your organization." },
16867
16969
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
16868
16970
  ]
16869
- }
16971
+ },
16972
+ { type: "paragraph", text: "After approval, the record's `status` changes to `approved` and a delivery signal is emitted into the outbox. Pair this with `POST /v1/review/batch` when you need to clear multiple items sharing similar characteristics, or call `GET /v1/review/stats` afterward to verify the **pending** count dropped as expected." }
16870
16973
  ],
16871
16974
  related: [
16872
16975
  { label: "Get Review Item", slug: "get-review-item" },
@@ -16936,7 +17039,8 @@ var sections39 = [
16936
17039
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
16937
17040
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
16938
17041
  ]
16939
- }
17042
+ },
17043
+ { type: "paragraph", text: "A common pattern is to first call `GET /v1/review?status=pending` to collect IDs, filter client-side by `overall_confidence` above a safe threshold, then batch-approve those IDs here. Check the `results` array for per-item outcomes -- items that were already actioned return an error status but do not block the rest of the batch." }
16940
17044
  ],
16941
17045
  related: [
16942
17046
  { label: "Review Action", slug: "review-action" },
@@ -17018,7 +17122,8 @@ var sections39 = [
17018
17122
  { name: "404", type: "not_found", description: "Review record not found or does not belong to your organization." },
17019
17123
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
17020
17124
  ]
17021
- }
17125
+ },
17126
+ { type: "paragraph", text: "Assignments are typically made after listing pending items via `GET /v1/review` and distributing them across team members. The `assigned_to` field appears in list and detail responses, so downstream tools can filter by assignee to build per-reviewer queues. Pass `null` as `user_id` to return an item to the unassigned pool." }
17022
17127
  ],
17023
17128
  related: [
17024
17129
  { label: "Get Review Item", slug: "get-review-item" },
@@ -18658,7 +18763,8 @@ var sections43 = [
18658
18763
  { name: "401", type: "unauthorized", description: "Missing or invalid API key." },
18659
18764
  { name: "429", type: "rate_limited", description: "Too many requests. Retry after the period indicated in the Retry-After header." }
18660
18765
  ]
18661
- }
18766
+ },
18767
+ { type: "paragraph", text: "Most integrations use registry query as a lookup layer after ingestion is complete. Call `POST /v1/extract` to ingest documents, wait for the `document.extraction.completed` webhook, then query the registry by field values to retrieve structured data across your entire corpus. Pair with `GET /v1/fields` to discover available canonical field names before building `where` conditions." }
18662
18768
  ],
18663
18769
  related: [
18664
18770
  { label: "Field Registry", slug: "field-registry" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talonic/docs",
3
- "version": "0.20.9",
3
+ "version": "0.20.10",
4
4
  "description": "Talonic documentation components — API Reference & Platform Guide",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,