jaz-clio 5.59.0 → 5.59.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/skills/api/SKILL.md +5 -5
- package/assets/skills/api/references/bank-rule-column-mapping.md +1 -1
- package/assets/skills/api/references/endpoints.md +79 -1
- package/assets/skills/api/references/feature-glossary.md +1 -1
- package/assets/skills/cli/SKILL.md +2 -2
- package/assets/skills/cli/references/command-catalog.md +6 -4
- package/assets/skills/conversion/SKILL.md +1 -1
- package/assets/skills/jaz-kit/SKILL.md +1 -1
- package/assets/skills/jaz-pseudo-sql/SKILL.md +1 -1
- package/assets/skills/jobs/SKILL.md +1 -1
- package/assets/skills/jobs/references/bank-recon.md +16 -3
- package/assets/skills/transaction-recipes/SKILL.md +1 -1
- package/cli.mjs +153 -151
- package/dashboard-routes-manifest.json +10 -0
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jaz-api
|
|
3
|
-
version: 5.59.
|
|
3
|
+
version: 5.59.2
|
|
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, 159 production gotchas, error
|
|
@@ -31,7 +31,7 @@ The rest of this skill — field names, gotchas, error catalog, dependency order
|
|
|
31
31
|
|
|
32
32
|
**Core fundamentals (read first, every integration):** Identifiers & Dates 1–3; Names & Fields 9–13; Transaction Creation 14–16; Chart of Accounts 17–22; Payments / Cross-Currency 4–8; Journals & Cash 23–26; Credit Notes & Refunds 27–28; Reports 36–37; Tax Profile Scoping 100; Transaction References 104; Draft Finalization Pipeline 81–88; Jaz Magic / PDF-JPG 57–63; Currency Rates 39, 49, 105; Withholding Tax 45, 98.
|
|
33
33
|
|
|
34
|
-
**Integration depth (API clients, pipelines, batch jobs, MCP/CLI):** Bulk Upsert (Items/Contacts/Rates); Background Jobs (filter `resourceId` not `jobId`); Export Records; Pagination (38); Search & Filter (50–56); Response Shape Gotchas (66–73); Cash Entry Response Shape (74–77); Entity Resolution (78–80); Bank Rules (89–
|
|
34
|
+
**Integration depth (API clients, pipelines, batch jobs, MCP/CLI):** Bulk Upsert (Items/Contacts/Rates); Background Jobs (filter `resourceId` not `jobId`); Export Records; Pagination (38); Search & Filter (50–56); Response Shape Gotchas (66–73); Cash Entry Response Shape (74–77); Entity Resolution (78–80); Bank Rules (89–90d); Fixed Assets (91–92c); Subscriptions & Scheduled (93–94); niche endpoints (95–102); Journals balance (103); Quick Fix (107, 111); TTB (108); Dynamic Strings (109–110); Sub-Resource Shapes (112); Nano-Classifier (113); Scheduler Asymmetry (114); Payment Record CRUD (115–117); Bulk Upserts transactions (118–122); Reconciliation write-side (123–127); Drafts lifecycle (128–135); Orders — Sale Quotes / Sale Orders / Purchase Requests / Purchase Orders (`references/orders.md`); Claims — records / lifecycle / bulk + conversion + payouts + Employees + Claim Settings (`references/claims.md`).
|
|
35
35
|
|
|
36
36
|
## When to Use This Skill
|
|
37
37
|
|
|
@@ -286,8 +286,8 @@ Bills, invoices, and credit notes share identical mandatory field specs. Adding
|
|
|
286
286
|
### Bank Rules
|
|
287
287
|
89. **Bank rules GET by ID has double-nested response** — `GET /bank-rules/:id` returns `{ data: { data: [...], totalElements, totalPages } }` (double `data` wrapper). Unlike standard `GET /:type/:id` which returns `{ data: {...} }`. The inner `data` is an array containing the single rule. Unwrap with `response.data.data[0]`. **Field asymmetry**: Request uses `appliesToReconciliationAccount` (string UUID), response returns it as an object `{ code, currencyCode, name }`.
|
|
288
288
|
90. **Bank rules search uses `/bank-rules/search`** — Standard search pattern with filter/sort/limit/offset. Filter fields: `appliesToReconciliationAccount`, `name`, `reference`, `resourceId`, `actionType`, `businessTransactionType`. Sort fields: `resourceId`, `name`, `actionType`, `businessTransactionType`, `reference`, `appliesToReconciliationAccount`, `createdAt`.
|
|
289
|
-
90a. **Bank rules create field is `appliesToReconciliationAccount`** (NOT `appliesToReconciliationAccountResourceId`) — the bank account UUID. `configuration` must nest under `reconcileWithDirectCashEntry` key. `configuration.reconcileWithDirectCashEntry.reference` is REQUIRED (omitting causes GENERAL_ERROR). `amountAllocationType`: use `"PERCENTAGE"` or `"FIXED"` — `"FIXED_AND_PERCENTAGE"` is read-only (include both `fixedAllocation` + `percentageAllocation` arrays and the server infers it). Optional config fields: `contactResourceId`, `internalNotes`, `tags`, `currencySettings`, `taxCurrencySettings`, `classifierConfig` on allocation lines.
|
|
290
|
-
90b. **Bank rules PUT is FULL REPLACEMENT** — `PUT /bank-rules/:id` replaces the entire rule. Must send `resourceId`, `appliesToReconciliationAccount`, and full `configuration` every time. Omitting any required field causes GENERAL_ERROR. Use read-modify-write pattern: GET current rule, merge changes, PUT full payload. Same pattern as items PUT (Rule 72) and capsules PUT (Rule 73).
|
|
289
|
+
90a. **Bank rules create field is `appliesToReconciliationAccount`** (NOT `appliesToReconciliationAccountResourceId`) — the bank account UUID. `configuration` must nest under `reconcileWithDirectCashEntry` key. `configuration.reconcileWithDirectCashEntry.reference` is REQUIRED (omitting causes GENERAL_ERROR). `amountAllocationType`: use `"PERCENTAGE"` or `"FIXED"` — `"FIXED_AND_PERCENTAGE"` is read-only (include both `fixedAllocation` + `percentageAllocation` arrays and the server infers it). Optional config fields: `contactResourceId`, `internalNotes`, `tags`, `currencySettings`, `taxCurrencySettings`, `classifierConfig` on allocation lines. **Send `searchFilter` too** — see 90d; a rule without one is never suggested.
|
|
290
|
+
90b. **Bank rules PUT is FULL REPLACEMENT** — `PUT /bank-rules/:id` replaces the entire rule. Must send `resourceId`, `appliesToReconciliationAccount`, and full `configuration` every time. Omitting any required field causes GENERAL_ERROR. Use read-modify-write pattern: GET current rule, merge changes, PUT full payload. Same pattern as items PUT (Rule 72) and capsules PUT (Rule 73). **`searchFilter` is the one exception**: omit it and the API keeps the stored condition, send `null` to remove it, send an object to replace it.
|
|
291
291
|
90c. **Bank rule POST canonical create payload** (verified live 2026-04, NOT obvious from any single field error):
|
|
292
292
|
```json
|
|
293
293
|
{
|
|
@@ -315,7 +315,7 @@ Bills, invoices, and credit notes share identical mandatory field specs. Adding
|
|
|
315
315
|
|
|
316
316
|
**actionShortcutResourceId** for `apply_bank_rule` IS the rule's own `resourceId` from create response (no separate "action shortcut" entity).
|
|
317
317
|
|
|
318
|
-
90d. **Bank rules support column-value mapping** — `reconcileWithDirectCashEntry` can resolve fields per row from a custom bank-statement column: `amountSourceColumnKey` (set amount by a column; mutually exclusive with `amount`), `organizationAccountResourceIdMap`/`taxProfileResourceIdMap`/`classifierConfigMap` on each `fixedAllocation` line, and `contactResourceIdMap`/`tagsMap` on the shortcut. Each `*Map` is a `ColumnValueMapConfig` (`columnKey` + ordered `mappings[]`, first match wins, blank `matchValue` = catch-all); `targetResourceId` is a UUID (tag NAME for `tagsMap`). `reference` also takes `{{column:<key>}}` / `{{column_abs:<key>}}` tokens. Full shape: `references/bank-rule-column-mapping.md`.
|
|
318
|
+
90d. **Bank rules support column-value mapping** — `reconcileWithDirectCashEntry` can resolve fields per row from a custom bank-statement column: `amountSourceColumnKey` (set amount by a column; mutually exclusive with `amount`), `organizationAccountResourceIdMap`/`taxProfileResourceIdMap`/`classifierConfigMap` on each `fixedAllocation` line, and `contactResourceIdMap`/`tagsMap` on the shortcut. Each `*Map` is a `ColumnValueMapConfig` (`columnKey` + ordered `mappings[]`, first match wins, blank `matchValue` = catch-all); `targetResourceId` is a UUID (tag NAME for `tagsMap`). `reference` also takes `{{column:<key>}}` / `{{column_abs:<key>}}` tokens. Full shape: `references/bank-rule-column-mapping.md`. **The rule's WHEN side is the inline `searchFilter`, and without one the rule is never suggested.** Auto-reconciliation only considers rules whose stored condition is non-null, so a rule created without it exists, lists, and applies manually, but is never offered. Shape: `{"version": 1, "raw": "description:grab", "parsed": {"description": {"contains": "grab"}}}` — `raw` is the one-line form shown in the app and **may be blank**; `parsed` is what the matcher compiles. Condition fields: `description`, `extReference`, `extContactName`, `netAmount`, `valueDate`, plus the account's active custom Bank Fields. Operators (15, from the matcher's own map): TEXT `eq`/`contains`/`notContains`/`startWith`/`notStartWith`/`isBlank`/`isNotBlank`, compared case-insensitively, the blank pair taking no value; NUMERIC `eq`/`gt`/`gte`/`lt`/`lte`/`inRange`/`notInRange`; DATE `eq`/`gt`/`gte`/`lt`/`lte`/`between`/`notBetween`. Combine with `{"and": {...}}` or `{"orGroup": [{"and": {...}}]}`. **An unsupported field path does not error** — the rule saves, lists, and then never fires, because the matcher logs a warning server-side and skips it; use only the fields above. `relatedSearchShortcutResourceIds` (the retired saved-search path) is not exposed by this API at all; the platform rejects a request that sets both.
|
|
319
319
|
|
|
320
320
|
### Fixed Assets
|
|
321
321
|
91. **Fixed asset search does NOT support `createdAt` sort** — Valid sort fields: `resourceId`, `name`, `purchaseDate`, `typeName`, `purchaseAmount`, `bookValueNetBookValueAmount`, `depreciationMethod`, `status`. Using `createdAt` returns 422. Default to `purchaseDate` DESC.
|
|
@@ -6,7 +6,7 @@ A bank rule's `reconcileWithDirectCashEntry` shortcut can resolve fields **per r
|
|
|
6
6
|
|
|
7
7
|
The columns referenced by `columnKey` are **Bank Fields** — typed custom columns (`DATE` / `STRING` / `AMOUNT`) defined per bank account and captured when a statement is imported. They make any statement column (branch code, bank charge, cost centre, settlement ref) first-class: usable in a rule's **conditions** (matching) and in its **outputs** (the maps below). `AMOUNT` fields keep their sign; `amountSourceColumnKey` uses the **absolute** value.
|
|
8
8
|
|
|
9
|
-
Scope note: the maps here are the rule **outputs** (what `create_bank_rule` / `update_bank_rule` set via `configuration`). The rule **conditions** (which statement lines the rule matches,
|
|
9
|
+
Scope note: the maps here are the rule **outputs** (what `create_bank_rule` / `update_bank_rule` set via `configuration`). The rule **conditions** (which statement lines the rule matches) are a separate field, `searchFilter`, which those same tools now set directly — `{ version: 1, raw, parsed }`, and a rule without one is never suggested by magic reconciliation. See jaz-api skill rule 90d for the condition grammar. The older linked-search-shortcut path (`relatedSearchShortcutResourceIds`) was retired upstream and is not exposed by this API.
|
|
10
10
|
|
|
11
11
|
## ColumnValueMapConfig shape
|
|
12
12
|
|
|
@@ -2535,4 +2535,82 @@ Append one review verb to a jot (append-only: annotates, never mutates).
|
|
|
2535
2535
|
|
|
2536
2536
|
---
|
|
2537
2537
|
|
|
2538
|
-
|
|
2538
|
+
## 26. Bank Rules CRUD
|
|
2539
|
+
|
|
2540
|
+
A bank rule has two halves: the **WHEN** (`searchFilter`, the condition deciding which statement lines it applies to) and the **THEN** (`configuration.reconcileWithDirectCashEntry`, the allocation). **A rule with no `searchFilter` is never suggested** — auto-reconciliation only considers rules whose stored condition is non-null, so it exists, lists, and can be applied by hand, but is never offered. See jaz-api rules 90a-90d for the full payload.
|
|
2541
|
+
|
|
2542
|
+
### GET /api/v1/bank-rules
|
|
2543
|
+
|
|
2544
|
+
Lists bank rules. Standard pagination (`limit`, `offset`).
|
|
2545
|
+
|
|
2546
|
+
### GET /api/v1/bank-rules/:resourceId
|
|
2547
|
+
|
|
2548
|
+
Returns one rule, including its `searchFilter`.
|
|
2549
|
+
|
|
2550
|
+
```json
|
|
2551
|
+
// Response (data):
|
|
2552
|
+
{
|
|
2553
|
+
"resourceId": "uuid",
|
|
2554
|
+
"name": "Grab rides",
|
|
2555
|
+
"actionType": "RECONCILE_WITH_DIRECT_CASH_ENTRY",
|
|
2556
|
+
"appliesToReconciliationAccount": { "code": "1001", "currencyCode": "SGD", "name": "Business Bank Account" },
|
|
2557
|
+
"searchFilter": {
|
|
2558
|
+
"version": 1,
|
|
2559
|
+
"raw": "description:grab",
|
|
2560
|
+
"parsed": { "description": { "contains": "grab" } }
|
|
2561
|
+
},
|
|
2562
|
+
"configuration": { "reconcileWithDirectCashEntry": { "...": "..." } }
|
|
2563
|
+
}
|
|
2564
|
+
```
|
|
2565
|
+
|
|
2566
|
+
`appliesToReconciliationAccount` comes back as an OBJECT on read but is sent as a bare UUID on write, so a rule cannot be round-tripped without substituting it.
|
|
2567
|
+
|
|
2568
|
+
### POST /api/v1/bank-rules
|
|
2569
|
+
|
|
2570
|
+
Creates a rule. `searchFilter` is optional on the wire and effectively required in practice.
|
|
2571
|
+
|
|
2572
|
+
```json
|
|
2573
|
+
// Request:
|
|
2574
|
+
{
|
|
2575
|
+
"name": "Grab rides",
|
|
2576
|
+
"appliesToReconciliationAccount": "<bank-account-uuid>",
|
|
2577
|
+
"searchFilter": {
|
|
2578
|
+
"version": 1,
|
|
2579
|
+
"raw": "description:grab",
|
|
2580
|
+
"parsed": { "description": { "contains": "grab" } }
|
|
2581
|
+
},
|
|
2582
|
+
"configuration": {
|
|
2583
|
+
"reconcileWithDirectCashEntry": {
|
|
2584
|
+
"amountAllocationType": "PERCENTAGE",
|
|
2585
|
+
"reference": "AUTO-{{bankReference}}",
|
|
2586
|
+
"percentageAllocation": [{ "organizationAccountResourceId": "<acct-uuid>", "amount": 100 }]
|
|
2587
|
+
}
|
|
2588
|
+
}
|
|
2589
|
+
}
|
|
2590
|
+
```
|
|
2591
|
+
|
|
2592
|
+
`searchFilter` rules: `version` must be `1`; `raw` must be PRESENT but **may be the empty string** (the app itself saves conditions that way); `parsed` must be a non-empty object. Condition fields are `description`, `extReference`, `extContactName`, `netAmount`, `valueDate`, plus the account's active custom Bank Fields. An unsupported field path does NOT error — the rule saves and then never fires.
|
|
2593
|
+
|
|
2594
|
+
### PUT /api/v1/bank-rules/:resourceId
|
|
2595
|
+
|
|
2596
|
+
Full replacement: send `resourceId`, `appliesToReconciliationAccount` and the whole `configuration` every time.
|
|
2597
|
+
|
|
2598
|
+
**`searchFilter` is the one exception to full replacement.** Omit the key and the stored condition is KEPT; send `null` to remove it; send an object to replace it. This matters because the obvious read-modify-write (GET, change the name, PUT) drops the condition unless you carry it across — which silently stops the rule ever being suggested again.
|
|
2599
|
+
|
|
2600
|
+
### DELETE /api/v1/bank-rules/:resourceId
|
|
2601
|
+
|
|
2602
|
+
Deletes a rule.
|
|
2603
|
+
|
|
2604
|
+
### POST /api/v1/bank-rules/search
|
|
2605
|
+
|
|
2606
|
+
Searches rules. Filter fields: `name`, `resourceId`, `actionType`, `appliesToReconciliationAccount`, `businessTransactionType`, `reference`, plus `and`/`or`.
|
|
2607
|
+
|
|
2608
|
+
```json
|
|
2609
|
+
{ "filter": { "name": { "contains": "grab" } }, "sort": { "sortBy": ["name"], "order": "ASC" }, "limit": 100 }
|
|
2610
|
+
```
|
|
2611
|
+
|
|
2612
|
+
**There is no filter on `searchFilter`**, so "which of my rules have no condition" cannot be asked server-side — list the rules and check the field client-side.
|
|
2613
|
+
|
|
2614
|
+
---
|
|
2615
|
+
|
|
2616
|
+
*Last updated: 2026-09-13 (added Bank Rules CRUD, section 26). Previous: 2026-07-11 — added Jots judgment journal, section 25. Previous: 2026-04-09 — Added: Contacts bulk-upsert (22), Background Jobs search (23), Export Records (24). 2026-03-13 — Payment record CRUD, nano-classifier, scheduler GET/PUT/DELETE.*
|
|
@@ -167,7 +167,7 @@ Match bank statement lines to Jaz transactions to verify cash balances. This is
|
|
|
167
167
|
|
|
168
168
|
**Bank Feeds**: Connect Airwallex, Aspire, Stripe, Wise, or Xendit for automated statement sync (up to 12 months history, daily auto-sync).
|
|
169
169
|
|
|
170
|
-
**Bank Rules**:
|
|
170
|
+
**Bank Rules**: Two halves. The WHEN is the inline `searchFilter` condition deciding which statement lines the rule applies to — without one the rule is never suggested under Apply Rule, only applied by hand. The THEN auto-allocates amounts using percentage-only or fixed+percentage splits (max 10 fixed + 10 percentage lines). Support dynamic strings `{{bankReference}}`, `{{bankPayee}}`, `{{bankDescription}}`.
|
|
171
171
|
|
|
172
172
|
Statement amounts are recorded in the bank account's currency — no auto-conversion. Cross-currency transactions prompt for cash received/spent in statement currency. Reconciled transactions become uneditable (must reset to edit).
|
|
173
173
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jaz-cli
|
|
3
|
-
version: 5.59.
|
|
3
|
+
version: 5.59.2
|
|
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,
|
|
@@ -259,7 +259,7 @@ Sending `lineItems[]` to the FLAT endpoint silently ignores them and creates a $
|
|
|
259
259
|
|
|
260
260
|
**Contacts & Configuration**: `contacts`, `contact-groups`, `accounts`, `items`, `tags`, `currencies`, `currency-rates`, `tax-profiles`, `custom-fields`, `bookmarks`, `nano-classifiers`
|
|
261
261
|
|
|
262
|
-
**Bank & Reconciliation**: `bank` (accounts, get, records, add-records, import, auto-recon), `bank-rules`
|
|
262
|
+
**Bank & Reconciliation**: `bank` (accounts, get, records, add-records, import, auto-recon), `bank-rules` (a rule needs `--search-filter` or auto-reconciliation never suggests it; on `update`, omitting the flag keeps the stored condition and `--clear-search-filter` removes it)
|
|
263
263
|
|
|
264
264
|
**Employee Claims & Settings**: `claims` (lifecycle + `create` + `from-attachment` + convert + payout), `employees`, `claim-types`, `claim-profiles`, `posting-rules`
|
|
265
265
|
|
|
@@ -318,14 +318,16 @@ EmploymentType: `FULL_TIME` · `PART_TIME` · `CONTRACTOR` · `INTERN` · `TEMPO
|
|
|
318
318
|
| Subcommand | Key flags |
|
|
319
319
|
|------------|-----------|
|
|
320
320
|
| `list` | `--limit`, `--offset`, `--all`, `--format`, `--json` |
|
|
321
|
-
| `get <id>` | `--json
|
|
322
|
-
| `search <query>` | `--limit`, `--offset` |
|
|
323
|
-
| `create` | `--
|
|
324
|
-
| `update <id>` | `--input` |
|
|
321
|
+
| `get <id>` | `--json`. Prints the rule's condition, or says it has none |
|
|
322
|
+
| `search <query>` | `--limit`, `--offset`, `--account` |
|
|
323
|
+
| `create` | `--name`, `--account`, `--config`, `--search-filter <json>`, `--input` |
|
|
324
|
+
| `update <id>` | `--account` (required), `--name`, `--config`, `--search-filter <json>`, `--clear-search-filter`, `--input` |
|
|
325
325
|
| `delete <id>` | |
|
|
326
326
|
|
|
327
327
|
Dynamic strings in rules: `{{bankReference}}`, `{{bankPayee}}`, `{{bankDescription}}`
|
|
328
328
|
|
|
329
|
+
**A rule without a condition is never suggested.** `--search-filter` is the rule's WHEN side; auto-reconciliation only considers rules whose stored condition is non-null, so a rule created without one exists, lists and applies by hand but is never offered. On `update` the condition is the one field a full-replacement PUT need not resend: **omit `--search-filter` and the stored condition is kept**, pass `--clear-search-filter` to remove it. Shape: `{"version":1,"raw":"description:grab","parsed":{"description":{"contains":"grab"}}}` — `raw` may be blank.
|
|
330
|
+
|
|
329
331
|
---
|
|
330
332
|
|
|
331
333
|
## Fixed Assets & Inventory
|
|
@@ -192,11 +192,24 @@ After creating, loop back to step 4 to reconcile.
|
|
|
192
192
|
```
|
|
193
193
|
create_bank_rule(
|
|
194
194
|
name: 'Monthly DBS Service Charge',
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
195
|
+
appliesToReconciliationAccount: '<bank-account-uuid>',
|
|
196
|
+
searchFilter: {
|
|
197
|
+
version: 1,
|
|
198
|
+
raw: 'description:service charge',
|
|
199
|
+
parsed: {and: {description: {contains: 'service charge'}, netAmount: {inRange: [20, 30]}}}
|
|
200
|
+
},
|
|
201
|
+
configuration: {
|
|
202
|
+
reconcileWithDirectCashEntry: {
|
|
203
|
+
reference: 'AUTO-{{bankReference}}',
|
|
204
|
+
amountAllocationType: 'PERCENTAGE',
|
|
205
|
+
percentageAllocation: [{organizationAccountResourceId: '<Bank Charges uuid>', amount: 100}]
|
|
206
|
+
}
|
|
207
|
+
}
|
|
198
208
|
)
|
|
199
209
|
```
|
|
210
|
+
`searchFilter` is the WHEN side and is what makes the rule eligible for suggestion at all — a rule
|
|
211
|
+
without one is never offered by auto-reconciliation. `configuration` is the THEN side. Condition
|
|
212
|
+
fields: `description`, `extReference`, `extContactName`, `netAmount`, `valueDate`.
|
|
200
213
|
Next month's same charge auto-reconciles via `apply_bank_rule`.
|
|
201
214
|
|
|
202
215
|
**Path D — flag for investigation:** if no match and no source document, surface to the user with the `extContactName + description` and the `netAmount`. Common: personal transactions, refunds, intercompany unrecorded, bank-feed errors. Record the unresolved item so it carries forward.
|