jaz-clio 9.2.2 → 9.2.4

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-api
3
- version: 9.2.2
3
+ version: 9.2.4
4
4
  description: >-
5
5
  Use this skill whenever you call, debug, or review code that touches the Jaz
6
6
  REST API. Covers field names, response shapes, 148 production gotchas, error
@@ -61,6 +61,7 @@ The rest of this skill (field names, gotchas, error catalog, dependency order, s
61
61
  6. **Payment bank account is `accountResourceId`**, not `bankAccountResourceId`.
62
62
  7. **Payments require 6 fields**: `paymentAmount`, `transactionAmount`, `accountResourceId`, `paymentMethod`, `reference`, `valueDate`.
63
63
  8. **Payments wrapped in `{ payments: [...] }`**, array recommended. Flat objects are now auto-wrapped by the API, but array format is preferred for clarity.
64
+ 8a. **On an invoice, bill or credit note update (`PUT`), `payments` (`refunds` on credit notes) edits payments by `resourceId`; it is not a replacement list.** An entry with a stored payment's `resourceId` (from `paymentRecords[]`) updates that payment in place and needs every payment field; `{ resourceId, deleted: true }` removes it; an entry without `resourceId` records a NEW payment; a stored payment left out stays as it is, unless the edit changes the document's total, currency or exchange rate: then every payment is deleted and its bank match released, and nothing records it again. `removedPaymentResourceIds` no longer exists and is ignored if sent. Never echo a stored payment without its `resourceId`: it is recorded a second time, or refused with `INVALID_PAYMENT_AMOUNT` on a fully paid document. Changing a payment's reference, date or method keeps its bank reconciliation; changing its amount releases it. A 422 applies nothing.
64
65
 
65
66
  ### Names & Fields
66
67
  9. **Line item descriptions use `name`**, not `description`.
@@ -107,7 +108,7 @@ The rest of this skill (field names, gotchas, error catalog, dependency order, s
107
108
  ### Journals & Cash
108
109
  23. **Journals use `journalEntries`** with `amount` + `type: "DEBIT"|"CREDIT"`, NOT `debit`/`credit` number fields.
109
110
  24. **Journals support multi-currency via `currency` object**, same format as invoices/bills: `"currency": { "sourceCurrency": "USD" }` (auto-fetch platform rate) or `"currency": { "sourceCurrency": "USD", "exchangeRate": 0.74 }` (custom rate). Must be enabled for the org. Omit for base currency. **Direction**: `exchangeRate` is functionalToSource (1 org-base unit = N `sourceCurrency`), usually the inverse of a quoted rate. Pass your figure as-is with `rateDirection` rather than inverting by hand; Rule 49. Three restrictions apply to foreign currency journals: (a) **no controlled accounts**: accounts with `controlFlag` (AR, AP) are off-limits (use invoices/bills instead), (b) **no FX accounts**: FX Unrealized Gain/Loss/Rounding are system-managed, (c) **bank accounts must match**: can only post to bank accounts in the same currency as the journal (e.g., USD journal → USD bank account only, not SGD bank account). All other non-controlled accounts (expenses, revenue, assets, liabilities) are available.
110
- 25. **`currency` object is the SAME everywhere**: invoices, bills, credit notes, AND journals all use `currency: { sourceCurrency: "USD", exchangeRate?: number, rateDirection?: "FUNCTIONAL_TO_SOURCE" | "SOURCE_TO_FUNCTIONAL" }`. **Direction**: `exchangeRate` is functionalToSource (1 org-base unit = N `sourceCurrency`), usually the inverse of a quoted rate. Pass your figure as-is with `rateDirection` rather than inverting by hand; Rule 49. Never use `currencyCode: "USD"` (silently ignored on invoices/bills) or `currency: "USD"` (string, causes 400 on invoices/bills).
111
+ 25. **`currency` object is the SAME on every create and update**: invoices, bills, credit notes, AND journals all use `currency: { sourceCurrency: "USD", exchangeRate?: number, rateDirection?: "FUNCTIONAL_TO_SOURCE" | "SOURCE_TO_FUNCTIONAL" }`. **Direction**: `exchangeRate` is functionalToSource (1 org-base unit = N `sourceCurrency`), usually the inverse of a quoted rate. Pass your figure as-is with `rateDirection` rather than inverting by hand; Rule 49. Never use `currencyCode: "USD"` (silently ignored on invoices/bills) or `currency: "USD"` (string, causes 400 on invoices/bills). **Exception, Quick Fix**: changing an existing record's currency uses `currencySettings: { sourceCurrencyCode }` (Rule 107); `currency` there is dropped.
111
112
  26. **Cash entries use `accountResourceId`** at top level for the BANK account + `lines` array for offsets.
112
113
 
113
114
  ### Credit Notes & Refunds
@@ -357,7 +358,7 @@ Bills, invoices, and credit notes share identical mandatory field specs. Adding
357
358
  106. **Contact PUT uses `email` (string), not `emails` (array)**: GET returns `emails: [{email, label}]` (array) but PUT accepts `email: "user@example.com"` (string). Sending the `emails` array in PUT body causes 400 "Invalid request body". The CLI and tool executor handle this automatically via read-modify-write with the correct field.
358
359
 
359
360
  ### Quick Fix (Bulk Update)
360
- 107. **24 Quick Fix endpoints for bulk-updating transactions and line items**: `POST /api/v1/quick-fix/{entity}` with `{ resourceIds: [...], attributes: {...} }`. Only included fields are changed; omitted fields are left unchanged. Response: `{ updated: string[], failed: [{ resourceId, error, errorCode }] }`. **HTTP status codes**: 200 = complete success (`failed` always empty). **207 Multi-Status** = partial or total failure with per-item detail (same response shape as 200, so check the `failed` array). 422 = total failure with no per-item breakdown (rare). On 207, retry only `failed` resourceIds. Entities: **ARAP**: invoices, bills, customer-credit-notes, supplier-credit-notes. **Accounting**: journals, cash-entries. **Schedulers**: sale-schedules, purchase-schedules, subscription-schedules, journal-schedules. **Orders (line items only, no transaction-level route)**: sale-orders, sale-quotes, purchase-orders, purchase-requests. **Line-item request patterns**: ARAP, accounting and orders use `{ lineItemResourceIds, attributes }` (purchase side adds `withholdingTax`). **Line-item `discount` and `withholdingTax` use the quick fix shapes, not the create/update ones**: `discount: { rateType: "PERCENTAGE"|"FLAT", rateValue }` (not a bare number) and `withholdingTax: { code, rate, rateType, type, description? }` (code, rate, rateType and type all required), on bills, supplier CNs and purchase orders/requests alike. Schedulers (sale/purchase/subscription) use Pattern C: `{ schedulerUpdates: [{ schedulerResourceId, lineItemUpdates: [{ arrayIndex, ...attrs }] }] }`. **Journal-schedules use Pattern D**: `lineItemResourceId` (UUID) instead of `arrayIndex`. **Field gotchas**: cash entries use `currencySetting` (singular: `{ rateFunctionalToSource, exchangeToken }`), NOT `currencySettings`. Journal schedules have `startDate` in addition to `endDate`/`interval`. Tags: string array, max 50 items, max 50 chars each; on invoices, bills and credit notes they total at most 1000 characters joined with `|`, else 422. **Line-item `classifierConfig`** sets or removes one classifier per entry: set = `{ resourceId, type, printable, selectedClasses }` with at least one class; remove = `{ resourceId, deleted: true }`; classifiers not named stay; `[]` changes nothing. A 207 `failed` entry can carry an empty `resourceId` when the failure matched no record.
361
+ 107. **24 Quick Fix endpoints for bulk-updating transactions and line items**: `POST /api/v1/quick-fix/{entity}` with `{ resourceIds: [...], attributes: {...} }`. Only included fields are changed; omitted fields are left unchanged. Response: `{ updated: string[], failed: [{ resourceId, error, errorCode }] }`. **HTTP status codes**: 200 = complete success (`failed` always empty). **207 Multi-Status** = partial or total failure with per-item detail (same response shape as 200, so check the `failed` array). 422 = total failure with no per-item breakdown (rare). On 207, retry only `failed` resourceIds. Entities: **ARAP**: invoices, bills, customer-credit-notes, supplier-credit-notes. **Accounting**: journals, cash-entries. **Schedulers**: sale-schedules, purchase-schedules, subscription-schedules, journal-schedules. **Orders (line items only, no transaction-level route)**: sale-orders, sale-quotes, purchase-orders, purchase-requests. **Line-item request patterns**: ARAP, accounting and orders use `{ lineItemResourceIds, attributes }` (purchase side adds `withholdingTax`). **Line-item `discount` and `withholdingTax` use the quick fix shapes, not the create/update ones**: `discount: { rateType: "PERCENTAGE"|"FLAT", rateValue }` (not a bare number) and `withholdingTax: { code, rate, rateType, type, description? }` (code, rate, rateType and type all required), on bills, supplier CNs and purchase orders/requests alike. Schedulers (sale/purchase/subscription) use Pattern C: `{ schedulerUpdates: [{ schedulerResourceId, lineItemUpdates: [{ arrayIndex, attributes: {...} }] }] }` (fields INSIDE `attributes`; beside `arrayIndex` they are unknown keys). **Journal-schedules use Pattern D**: `lineItemResourceId` (UUID) instead of `arrayIndex`. **Field gotchas**: an unknown field is a 400 that names it, and clio refuses it before sending (per-entity list: endpoints.md, generated from the spec). A change to a paid document's currency or rate, a line's quantity, price, discount or tax, or the date of a foreign-currency document (its rate is fetched again) deletes its payments as in Rule 8a. Currency change: `currencySettings: { sourceCurrencyCode }` (not the create shape `currency: { sourceCurrency }`); lines and tax profiles stay. `sourceCurrencyCode` is required even when only `rateFunctionalToSource` changes (422 without it), and schedules also need the rate. `billFrom`/`billTo`/`creditFrom`/`creditTo` need `name` and `billingAddress` (plus `shippingAddress` on `billTo`/`creditTo`), each address with `addressLine1`; the address is replaced, not merged, so resend stored values you are not changing. Cash entries use `currencySetting` (singular: `{ rateFunctionalToSource, exchangeToken }`), NOT `currencySettings`. Journal schedules take `endDate`/`interval`, not `startDate` (a schedule's start date cannot change). Sale and subscription schedule lines refuse `withholdingTax`. Tags: string array, max 50 items, max 50 chars each; on invoices, bills and credit notes they total at most 1000 characters joined with `|`, else 422. **Line-item `classifierConfig`** sets or removes one classifier per entry: set = `{ resourceId, type, printable, selectedClasses }` with at least one class; remove = `{ resourceId, deleted: true }`; classifiers not named stay; `[]` changes nothing. A 207 `failed` entry can carry an empty `resourceId` when the failure matched no record.
361
362
  107a. **Ledger Find & Fix: find and fix (recode) records across types with one filter, preview one change, apply it once.** Use it when a user asks to find & fix, recode, reclassify, retag, re-date or move records to another account across many records or several types. `POST /api/v1/ledger/find-fix/transactions/preview` (sets contact, date, capsule, tags) or `POST /api/v1/ledger/find-fix/line-items/preview` (sets account, classifiers), each with `{ filter, change }`, then `POST /api/v1/ledger/find-fix/apply` with `{ previewId }`; conditions, bodies and every code are in endpoints.md section 17a. `JOURNAL` covers manual and cashflow journals only: transfer and trial-balance journals and cash transfers never match, so their ids come back `NOT_FOUND`. **A filter with no condition besides `types` is a 422, and a condition with no operator is ignored.** **The API refuses a key it does not take, at any level, with 400 `invalid_filter` naming the key**; the tools and the CLI refuse a field of the other level before the request, naming the level that takes it. `tags` `{ add, remove }` keeps the record's other tags, so setting tags to X means removing the current ones and adding X. A classifier removal needs only `{ resourceId, deleted: true }`, even for a classifier the organization no longer has. **Preview** writes nothing, matches at most 500 records, and returns `previewId` (valid 30 minutes; absent when nothing is eligible). **A blocked field is left as it is while the record's other fields still change.** **Apply** is single use and saves the preview-time values, so a field edited between preview and apply, tags included, is overwritten. Once it has taken the preview it runs to the end even if the caller leaves, and starts no new call 3 minutes after the request arrived. 207 lists the `failed` records with an `errorCode`; `OUTCOME_UNKNOWN` means that record may have changed. 404 `PREVIEW_NOT_FOUND` (expired, used, being applied, or another caller's): preview again, never resend. **Any other 5xx, or a timeout, on apply means the outcome is unknown: if the connection drops, the apply keeps running for up to 4 minutes. Wait that long before previewing or applying again on the same records, then preview again or re-read them. Never apply this previewId again.** Several applies can run at the same time. When two applies change records on one document at once, the one saved last can undo the other's changes, including fields and line items it did not set. Preview again to check the result. Lock dates, filed tax periods and claims-backed documents fail per record, and e-invoice filings may be re-submitted. Rule 107's per-type routes stay for one document, for fields this does not change (due date, tax profile, notes, amounts, custom fields) and for scheduled transactions.
362
363
 
363
364
  ### Transfer Trial Balance
@@ -370,7 +371,7 @@ Bills, invoices, and credit notes share identical mandatory field specs. Adding
370
371
  110. **Bank rule placeholder strings**: Bank reconciliation rules support dynamic strings in any free text field (`name`, `reference`, cash entry description). Strings are replaced with actual **bank record** values during reconciliation: `{{bankReference}}` → bank record reference (e.g., INV-03/01/2025-01), `{{bankPayee}}` → payer/payee name (e.g., Fruit Planet), `{{bankDescription}}` → transaction description (e.g., QR Payment). Example: `reference: "{{bankPayee}} - {{bankReference}}"`.
371
372
 
372
373
  ### Quick Fix Tag Field
373
- 111. **Quick-fix uses `tags` (string array), e.g., `"tags": ["Q1"]`**: The `attributes` object in quick-fix transaction endpoints accepts `tags` as a string array (e.g., `"tags": ["Q1"]`). `tag` (singular) is silently ignored. This matches the `tags` array format used on create/update for all transaction types. The CLI `--tag` flag auto-wraps to `tags: [name]`.
374
+ 111. **Quick-fix uses `tags` (string array), e.g., `"tags": ["Q1"]`**: The `attributes` object in quick-fix transaction endpoints accepts `tags` as a string array (e.g., `"tags": ["Q1"]`). `tag` (singular) is refused as an unknown key. This matches the `tags` array format used on create/update for all transaction types. The CLI `--tag` flag auto-wraps to `tags: [name]`.
374
375
 
375
376
  ### Sub-Resource Response Shapes
376
377
  112. **Invoice/bill payment & credit sub-resources: two shapes** (read from the API source; payments and the empty-credits case measured raw 2026-09-24). `GET /invoices/:id/payments` and `GET /bills/:id/payments` return `{ data: [{paymentRecord}, ...] }` (Rule 64). `GET /invoices/:id/credits` and `GET /bills/:id/credits` return `{ TotalElements, data: [...] }` when credits are applied but a BARE `[]` when none are. The CLI and tools normalize all of these to `{data: [...]}`. `DELETE /invoices/:id/credits/:creditsAppliedResourceId` reverses a credit application.
@@ -2062,7 +2062,7 @@ POST /api/v1/quick-fix/sale-schedules/line-items
2062
2062
  {
2063
2063
  "schedulerResourceId": "sched-uuid",
2064
2064
  "lineItemUpdates": [
2065
- { "arrayIndex": 0, "unitPrice": 200 }
2065
+ { "arrayIndex": 0, "attributes": { "unitPrice": 200 } }
2066
2066
  ]
2067
2067
  }
2068
2068
  ]
@@ -2086,18 +2086,37 @@ POST /api/v1/quick-fix/sale-schedules/line-items
2086
2086
 
2087
2087
  Only included fields are changed; omitted fields are left unchanged.
2088
2088
 
2089
- **Transaction-level by entity**:
2090
- - **Invoices**: valueDate, dueDate, invoiceNotes, templateResourceId, contactResourceId, billFrom, billTo, currencySettings, taxCurrencySettings, tags, customFields, capsuleResourceId
2091
- - **Bills**: valueDate, dueDate, contactResourceId, currencySettings, taxCurrencySettings, tags, customFields, capsuleResourceId
2092
- - **Customer CNs**: valueDate, notes, templateResourceId, contactResourceId, creditFrom, creditTo, currencySettings, taxCurrencySettings, tags, customFields, capsuleResourceId
2093
- - **Supplier CNs**: valueDate, contactResourceId, currencySettings, taxCurrencySettings, tags, customFields, capsuleResourceId
2094
- - **Journals**: valueDate, contactResourceId, tags, internalNotes, capsuleResourceId
2095
- - **Cash entries**: organizationAccountResourceId, valueDate, contactResourceId, capsuleResourceId, tags, reference, `currencySetting` (SINGULAR: `{ rateFunctionalToSource, exchangeToken }`), taxCurrencySettings
2096
- - **Sale/subscription schedules**: endDate, interval, invoiceNotes, templateResourceId, contactResourceId, billFrom, billTo, tags, customFields, capsuleResourceId (+ currencySettings/taxCurrencySettings for sale only)
2097
- - **Purchase schedules**: endDate, interval, contactResourceId, currencySettings, taxCurrencySettings, tags, customFields, capsuleResourceId
2098
- - **Journal schedules**: startDate, endDate, interval, contactResourceId, tags, internalNotes, capsuleResourceId
2099
-
2100
- **Line items, ARAP and orders (Pattern B)**: name, quantity, unit, unitPrice, discount, itemResourceId, organizationAccountResourceId, taxProfileResourceId, classifierConfig, withholdingTax (purchase side only: bills, supplier CNs, purchase orders, purchase requests).
2089
+ <!-- quick-fix-fields:start (generated by scripts/gen-quick-fix-fields.ts from spec/openapi.yaml; do not edit) -->
2090
+ **Transaction-level `attributes`**, per entity:
2091
+ - **bills**: `capsuleResourceId`, `contactResourceId`, `currencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`, `customFields`, `dueDate`, `tags`, `taxCurrencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`, `valueDate`
2092
+ - **cash-entries**: `capsuleResourceId`, `contactResourceId`, `currencySetting {exchangeToken, rateFunctionalToSource}`, `organizationAccountResourceId`, `reference`, `tags`, `taxCurrencySettings {exchangeRate, sourceCurrency}`, `valueDate`
2093
+ - **customer-credit-notes**: `capsuleResourceId`, `contactResourceId`, `creditFrom {billingAddress {addressLine1, addressLine2, city, country, postalCode, state}, name, taxId}`, `creditTo {billingAddress {addressLine1, addressLine2, city, country, postalCode, state}, name, shippingAddress {addressLine1, addressLine2, city, country, postalCode, state}, taxId}`, `currencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`, `customFields`, `notes`, `tags`, `taxCurrencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`, `templateResourceId`, `valueDate`
2094
+ - **invoices**: `billFrom {billingAddress {addressLine1, addressLine2, city, country, postalCode, state}, name, taxId}`, `billTo {billingAddress {addressLine1, addressLine2, city, country, postalCode, state}, name, shippingAddress {addressLine1, addressLine2, city, country, postalCode, state}, taxId}`, `capsuleResourceId`, `contactResourceId`, `currencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`, `customFields`, `dueDate`, `invoiceNotes`, `tags`, `taxCurrencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`, `templateResourceId`, `valueDate`
2095
+ - **journal-schedules**: `capsuleResourceId`, `contactResourceId`, `endDate`, `internalNotes`, `interval`, `tags`
2096
+ - **journals**: `capsuleResourceId`, `contactResourceId`, `internalNotes`, `tags`, `valueDate`
2097
+ - **purchase-schedules**: `capsuleResourceId`, `contactResourceId`, `currencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`, `customFields`, `endDate`, `interval`, `tags`, `taxCurrencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`
2098
+ - **sale-schedules**: `billFrom {billingAddress {addressLine1, addressLine2, city, country, postalCode, state}, name, taxId}`, `billTo {billingAddress {addressLine1, addressLine2, city, country, postalCode, state}, name, shippingAddress {addressLine1, addressLine2, city, country, postalCode, state}, taxId}`, `capsuleResourceId`, `contactResourceId`, `currencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`, `customFields`, `endDate`, `interval`, `invoiceNotes`, `tags`, `taxCurrencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`, `templateResourceId`
2099
+ - **subscription-schedules**: `billFrom {billingAddress {addressLine1, addressLine2, city, country, postalCode, state}, name, taxId}`, `billTo {billingAddress {addressLine1, addressLine2, city, country, postalCode, state}, name, shippingAddress {addressLine1, addressLine2, city, country, postalCode, state}, taxId}`, `capsuleResourceId`, `contactResourceId`, `customFields`, `endDate`, `interval`, `invoiceNotes`, `tags`, `templateResourceId`
2100
+ - **supplier-credit-notes**: `capsuleResourceId`, `contactResourceId`, `currencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`, `customFields`, `tags`, `taxCurrencySettings {exchangeToken, rateFunctionalToSource, sourceCurrencyCode}`, `valueDate`
2101
+
2102
+ **Line-item `attributes`**, per entity (schedules nest them: `lineItemUpdates: [{ <locator>, attributes }]`):
2103
+ - **bills**: `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `discount {rateType, rateValue}`, `itemResourceId`, `name`, `organizationAccountResourceId`, `quantity`, `taxProfileResourceId`, `unit`, `unitPrice`, `withholdingTax {code, description, rate, rateType, type}`
2104
+ - **cash-entries**: `amount`, `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `description`, `organizationAccountResourceId`, `taxProfileResourceId`
2105
+ - **customer-credit-notes**: `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `discount {rateType, rateValue}`, `itemResourceId`, `name`, `organizationAccountResourceId`, `quantity`, `taxProfileResourceId`, `unit`, `unitPrice`
2106
+ - **invoices**: `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `discount {rateType, rateValue}`, `itemResourceId`, `name`, `organizationAccountResourceId`, `quantity`, `taxProfileResourceId`, `unit`, `unitPrice`
2107
+ - **journal-schedules** (locator `lineItemResourceId`): `amount`, `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `description`, `itemResourceId`, `organizationAccountResourceId`, `pricePerUnit`, `quantity`, `taxProfileResourceId`, `unit`
2108
+ - **journals**: `amount`, `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `description`, `organizationAccountResourceId`, `taxProfileResourceId`
2109
+ - **purchase-orders**: `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `discount {rateType, rateValue}`, `itemResourceId`, `name`, `organizationAccountResourceId`, `quantity`, `taxProfileResourceId`, `unit`, `unitPrice`, `withholdingTax {code, description, rate, rateType, type}`
2110
+ - **purchase-requests**: `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `discount {rateType, rateValue}`, `itemResourceId`, `name`, `organizationAccountResourceId`, `quantity`, `taxProfileResourceId`, `unit`, `unitPrice`, `withholdingTax {code, description, rate, rateType, type}`
2111
+ - **purchase-schedules** (locator `arrayIndex`): `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `description`, `discount {rateType, rateValue}`, `itemResourceId`, `name`, `organizationAccountResourceId`, `quantity`, `sku`, `taxProfileResourceId`, `unit`, `unitPrice`, `withholdingTax {code, description, rate, rateType, type}`
2112
+ - **sale-orders**: `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `discount {rateType, rateValue}`, `itemResourceId`, `name`, `organizationAccountResourceId`, `quantity`, `taxProfileResourceId`, `unit`, `unitPrice`
2113
+ - **sale-quotes**: `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `discount {rateType, rateValue}`, `itemResourceId`, `name`, `organizationAccountResourceId`, `quantity`, `taxProfileResourceId`, `unit`, `unitPrice`
2114
+ - **sale-schedules** (locator `arrayIndex`): `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `description`, `discount {rateType, rateValue}`, `itemResourceId`, `name`, `organizationAccountResourceId`, `quantity`, `sku`, `taxProfileResourceId`, `unit`, `unitPrice`, `withholdingTax {code, description, rate, rateType, type}`
2115
+ - **subscription-schedules** (locator `arrayIndex`): `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `description`, `discount {rateType, rateValue}`, `itemResourceId`, `name`, `organizationAccountResourceId`, `quantity`, `sku`, `taxProfileResourceId`, `unit`, `unitPrice`, `withholdingTax {code, description, rate, rateType, type}`
2116
+ - **supplier-credit-notes**: `classifierConfig {deleted, printable, resourceId, selectedClasses {className, entityResourceId, resourceId}, type}`, `discount {rateType, rateValue}`, `itemResourceId`, `name`, `organizationAccountResourceId`, `quantity`, `taxProfileResourceId`, `unit`, `unitPrice`, `withholdingTax {code, description, rate, rateType, type}`
2117
+ <!-- quick-fix-fields:end -->
2118
+
2119
+ A field not listed for an entity is refused by clio before any request: the API itself drops an unknown field and still reports the record as updated. `currencySettings` with `sourceCurrencyCode` alone changes a record's currency (line amounts and tax profiles stay; the platform rate applies); it is not the create shape `currency: { sourceCurrency }`. Cash entries take `currencySetting` (singular, rate only). `customFields` rows are `{ customFieldName, actualValue }`, as on create; a row's other keys are the custom field's own settings.
2101
2120
 
2102
2121
  **Quick fix line-item shapes differ from create/update** (every Pattern B route, orders included):
2103
2122
 
@@ -2108,12 +2127,6 @@ Only included fields are changed; omitted fields are left unchanged.
2108
2127
 
2109
2128
  **Line item `classifierConfig`** (every line-item route): each entry sets or removes ONE classifier; classifiers the request does not name are left as they are, and `[]` changes nothing. Set: `{ resourceId, type, printable, selectedClasses }` with at least one class. Remove: `{ resourceId, deleted: true }` (type, printable and selectedClasses not needed). Each selected class needs `className` plus `resourceId`, or `entityResourceId` instead when the classifier draws its options from customers, suppliers, contacts, employees or users.
2110
2129
 
2111
- **Line items (journal/cash-entry, Pattern B)**: organizationAccountResourceId, amount, description, taxProfileResourceId, classifierConfig.
2112
-
2113
- **Line items (schedulers, Pattern C, arrayIndex)**: name, description, sku, unit, unitPrice, quantity, discount, taxProfileResourceId, organizationAccountResourceId, classifierConfig, itemResourceId, withholdingTax (purchase only).
2114
-
2115
- **Line items (journal-schedules, Pattern D, lineItemResourceId)**: amount, description, organizationAccountResourceId, taxProfileResourceId, classifierConfig, itemResourceId, unit, quantity, pricePerUnit.
2116
-
2117
2130
  ### Pattern D Example (Journal Schedule Line Items)
2118
2131
 
2119
2132
  ```json
@@ -2125,8 +2138,7 @@ POST /api/v1/quick-fix/journal-schedules/line-items
2125
2138
  "lineItemUpdates": [
2126
2139
  {
2127
2140
  "lineItemResourceId": "line-uuid",
2128
- "amount": 500,
2129
- "organizationAccountResourceId": "acct-uuid"
2141
+ "attributes": { "amount": 500, "organizationAccountResourceId": "acct-uuid" }
2130
2142
  }
2131
2143
  ]
2132
2144
  }
@@ -2134,7 +2146,7 @@ POST /api/v1/quick-fix/journal-schedules/line-items
2134
2146
  }
2135
2147
  ```
2136
2148
 
2137
- Note: journal-schedules use `lineItemResourceId` (UUID), NOT `arrayIndex`.
2149
+ Note: journal-schedules use `lineItemResourceId` (UUID), NOT `arrayIndex`. On every schedule route the fields sit inside `attributes`; a field beside the locator is dropped by the API.
2138
2150
 
2139
2151
  **Tags**: string array, max 50 items, max 50 chars each. On invoices, bills and both credit notes the tags, joined with `|`, total at most 1000 characters, else 422.
2140
2152
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-cli
3
- version: 9.2.2
3
+ version: 9.2.4
4
4
  description: >-
5
5
  Use this skill when running Clio CLI commands, building shell scripts with
6
6
  Clio, debugging auth issues, understanding --json output, paginating results,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-conversion
3
- version: 9.2.2
3
+ version: 9.2.4
4
4
  description: >-
5
5
  Use this skill when migrating accounting data into Jaz, importing from Xero,
6
6
  QuickBooks, Sage, MYOB, or Excel exports. Covers the full conversion pipeline:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-kit
3
- version: 9.2.2
3
+ version: 9.2.4
4
4
  description: >-
5
5
  Use this skill when an accountant, bookkeeper, or owner is running real books
6
6
  in Jaz across one or more organizations from the terminal: setting up a
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-pseudo-sql
3
- version: 9.2.2
3
+ version: 9.2.4
4
4
  description: >-
5
5
  Use this skill when answering ad-hoc data questions that aren't covered by
6
6
  download_export (canonical reports: anomaly, audit, aging, P&L, BS, GL,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-jobs
3
- version: 9.2.2
3
+ version: 9.2.4
4
4
  description: >-
5
5
  Use this skill for recurring accounting workflows: month/quarter/year-end
6
6
  close, bank reconciliation, GST/VAT filing, payment runs, credit control,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-recipes
3
- version: 9.2.2
3
+ version: 9.2.4
4
4
  description: >-
5
5
  Use this skill when modeling complex multi-step accounting transactions:
6
6
  anything that spans multiple periods, involves changing amounts, or requires