jaz-clio 4.48.8 → 4.48.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 (86) hide show
  1. package/assets/skills/api/SKILL.md +374 -0
  2. package/assets/skills/api/help-center-mirror/ai-agents.md +142 -0
  3. package/assets/skills/api/help-center-mirror/approvals.md +68 -0
  4. package/assets/skills/api/help-center-mirror/bank-reconciliations.md +662 -0
  5. package/assets/skills/api/help-center-mirror/bills.md +1122 -0
  6. package/assets/skills/api/help-center-mirror/cashflow.md +105 -0
  7. package/assets/skills/api/help-center-mirror/collaboration.md +58 -0
  8. package/assets/skills/api/help-center-mirror/contacts.md +199 -0
  9. package/assets/skills/api/help-center-mirror/customer-credits.md +745 -0
  10. package/assets/skills/api/help-center-mirror/dashboard.md +29 -0
  11. package/assets/skills/api/help-center-mirror/deposits.md +75 -0
  12. package/assets/skills/api/help-center-mirror/fixed-assets.md +117 -0
  13. package/assets/skills/api/help-center-mirror/get-started.md +478 -0
  14. package/assets/skills/api/help-center-mirror/help-center-embeddings.json +1 -0
  15. package/assets/skills/api/help-center-mirror/help-center-index.json +1 -0
  16. package/assets/skills/api/help-center-mirror/import-data.md +256 -0
  17. package/assets/skills/api/help-center-mirror/index.md +22 -0
  18. package/assets/skills/api/help-center-mirror/invoices.md +1389 -0
  19. package/assets/skills/api/help-center-mirror/journal-entries.md +350 -0
  20. package/assets/skills/api/help-center-mirror/products.md +201 -0
  21. package/assets/skills/api/help-center-mirror/reports.md +852 -0
  22. package/assets/skills/api/help-center-mirror/security-privacy.md +42 -0
  23. package/assets/skills/api/help-center-mirror/settings.md +1778 -0
  24. package/assets/skills/api/help-center-mirror/supplier-credits.md +703 -0
  25. package/assets/skills/api/references/dependencies.md +140 -0
  26. package/assets/skills/api/references/endpoints.md +2191 -0
  27. package/assets/skills/api/references/errors.md +860 -0
  28. package/assets/skills/api/references/feature-glossary.md +248 -0
  29. package/assets/skills/api/references/field-map.md +618 -0
  30. package/assets/skills/api/references/full-api-surface.md +705 -0
  31. package/assets/skills/api/references/search-reference.md +724 -0
  32. package/assets/skills/cli/SKILL.md +267 -0
  33. package/assets/skills/cli/references/command-catalog.md +474 -0
  34. package/assets/skills/cli/references/common-workflows.md +246 -0
  35. package/assets/skills/conversion/SKILL.md +155 -0
  36. package/assets/skills/conversion/references/edge-cases.md +219 -0
  37. package/assets/skills/conversion/references/file-analysis.md +120 -0
  38. package/assets/skills/conversion/references/file-types.md +502 -0
  39. package/assets/skills/conversion/references/mapping-rules.md +249 -0
  40. package/assets/skills/conversion/references/option1-full.md +168 -0
  41. package/assets/skills/conversion/references/option2-quick.md +223 -0
  42. package/assets/skills/conversion/references/verification.md +164 -0
  43. package/assets/skills/jobs/SKILL.md +172 -0
  44. package/assets/skills/jobs/references/audit-prep.md +319 -0
  45. package/assets/skills/jobs/references/bank-match.md +290 -0
  46. package/assets/skills/jobs/references/bank-recon.md +236 -0
  47. package/assets/skills/jobs/references/building-blocks.md +135 -0
  48. package/assets/skills/jobs/references/credit-control.md +273 -0
  49. package/assets/skills/jobs/references/document-collection.md +240 -0
  50. package/assets/skills/jobs/references/fa-review.md +267 -0
  51. package/assets/skills/jobs/references/gst-vat-filing.md +250 -0
  52. package/assets/skills/jobs/references/month-end-close.md +308 -0
  53. package/assets/skills/jobs/references/payment-run.md +246 -0
  54. package/assets/skills/jobs/references/quarter-end-close.md +268 -0
  55. package/assets/skills/jobs/references/sg-tax/add-backs-guide.md +354 -0
  56. package/assets/skills/jobs/references/sg-tax/capital-allowances-guide.md +343 -0
  57. package/assets/skills/jobs/references/sg-tax/data-extraction.md +409 -0
  58. package/assets/skills/jobs/references/sg-tax/enhanced-deductions.md +248 -0
  59. package/assets/skills/jobs/references/sg-tax/exemptions-and-rebates.md +197 -0
  60. package/assets/skills/jobs/references/sg-tax/form-cs-fields.md +191 -0
  61. package/assets/skills/jobs/references/sg-tax/ifrs16-tax-adjustment.md +194 -0
  62. package/assets/skills/jobs/references/sg-tax/losses-and-carry-forwards.md +269 -0
  63. package/assets/skills/jobs/references/sg-tax/overview.md +207 -0
  64. package/assets/skills/jobs/references/sg-tax/wizard-workflow.md +391 -0
  65. package/assets/skills/jobs/references/supplier-recon.md +330 -0
  66. package/assets/skills/jobs/references/year-end-close.md +341 -0
  67. package/assets/skills/transaction-recipes/SKILL.md +268 -0
  68. package/assets/skills/transaction-recipes/references/accrued-expenses.md +157 -0
  69. package/assets/skills/transaction-recipes/references/asset-disposal.md +174 -0
  70. package/assets/skills/transaction-recipes/references/bad-debt-provision.md +145 -0
  71. package/assets/skills/transaction-recipes/references/bank-loan.md +145 -0
  72. package/assets/skills/transaction-recipes/references/building-blocks.md +153 -0
  73. package/assets/skills/transaction-recipes/references/capital-wip.md +167 -0
  74. package/assets/skills/transaction-recipes/references/declining-balance.md +190 -0
  75. package/assets/skills/transaction-recipes/references/deferred-revenue.md +125 -0
  76. package/assets/skills/transaction-recipes/references/dividend.md +111 -0
  77. package/assets/skills/transaction-recipes/references/employee-accruals.md +154 -0
  78. package/assets/skills/transaction-recipes/references/fixed-deposit.md +164 -0
  79. package/assets/skills/transaction-recipes/references/fx-revaluation.md +135 -0
  80. package/assets/skills/transaction-recipes/references/hire-purchase.md +190 -0
  81. package/assets/skills/transaction-recipes/references/ifrs16-lease.md +188 -0
  82. package/assets/skills/transaction-recipes/references/intercompany.md +150 -0
  83. package/assets/skills/transaction-recipes/references/prepaid-amortization.md +123 -0
  84. package/assets/skills/transaction-recipes/references/provisions.md +142 -0
  85. package/cli.mjs +259 -259
  86. package/package.json +1 -1
@@ -0,0 +1,374 @@
1
+ ---
2
+ name: jaz-api
3
+ version: 4.48.10
4
+ description: >-
5
+ Use this skill whenever you call, debug, or review code that touches the Jaz
6
+ REST API. Covers field names, response shapes, 117 production gotchas, error
7
+ recovery (422/400/404/500), search filters, pagination, and edge cases for
8
+ every endpoint — invoices, bills, credit notes, journals, cash entries,
9
+ payments, contacts, CoA, items, tax profiles, bank records, fixed assets,
10
+ schedulers, subscriptions, attachments, and Jaz Magic extraction. Also use
11
+ when building API clients, seeding test data, or adding new endpoint support.
12
+ license: MIT
13
+ compatibility: Requires Jaz API key (x-jk-api-key header). Works with Claude Code, Google Antigravity, OpenAI Codex, GitHub Copilot, Cursor, and any agent that reads markdown.
14
+ ---
15
+
16
+ # Jaz API Skill
17
+
18
+ You are working with the **Jaz REST API** — the accounting platform backend. Also fully compatible with Juan Accounting (same API, same endpoints).
19
+
20
+ ## When to Use This Skill
21
+
22
+ - Writing or modifying any code that calls the Jaz API
23
+ - Building API clients, integrations, or data pipelines
24
+ - Debugging API errors (422, 400, 404, 500)
25
+ - Adding support for new Jaz API endpoints
26
+ - Reviewing code that constructs Jaz API request payloads
27
+
28
+ ## Quick Reference
29
+
30
+ **Base URL**: `https://api.getjaz.com`
31
+ **Auth**: `x-jk-api-key: <key>` header on every request — key has `jk-` prefix (e.g., `jk-a1b2c3...`). NOT `Authorization: Bearer` or `x-api-key`.
32
+ **Content-Type**: `application/json` for all POST/PUT/PATCH (except multipart endpoints: `createBusinessTransactionFromAttachment` FILE mode, `importBankStatementFromAttachment`, and attachment uploads)
33
+ **All paths are prefixed**: `/api/v1/` (e.g., `https://api.getjaz.com/api/v1/invoices`)
34
+
35
+ ## Critical Rules
36
+
37
+ ### Identifiers & Dates
38
+ 1. **All IDs are `resourceId`** — never `id`. References use `<resource>ResourceId` suffix.
39
+ 2. **All transaction dates are `valueDate`** — not `issueDate`, `invoiceDate`, `date`. This is an accounting term meaning "date of economic effect."
40
+ 3. **All dates are `YYYY-MM-DD` strings** — ISO datetime and epoch ms are rejected.
41
+
42
+ ### Payments (Cross-Currency Aware)
43
+ 4. **Payment amounts have two fields**: `paymentAmount` = bank account currency (actual cash moved), `transactionAmount` = transaction document currency (invoice/bill/credit note — amount applied to balance). For same-currency, both are equal. For FX (e.g., USD invoice paid from SGD bank at 1.35): `paymentAmount: 1350` (SGD), `transactionAmount: 1000` (USD).
44
+ 5. **Payment date is `valueDate`** — not `paymentDate`, not `date`.
45
+ 6. **Payment bank account is `accountResourceId`** — not `bankAccountResourceId`.
46
+ 7. **Payments require 6 fields**: `paymentAmount`, `transactionAmount`, `accountResourceId`, `paymentMethod`, `reference`, `valueDate`.
47
+ 8. **Payments wrapped in `{ payments: [...] }`** — array recommended. Flat objects are now auto-wrapped by the API, but array format is preferred for clarity.
48
+
49
+ ### Names & Fields
50
+ 9. **Line item descriptions use `name`** — not `description`.
51
+ 10. **Item names**: canonical field is `internalName`, but `name` alias is accepted on POST. GET responses return both `internalName` and `name`.
52
+ 11. **Tag names**: canonical field is `tagName`, but `name` alias is accepted on POST. GET responses return both `tagName` and `name`.
53
+ 12. **Custom field names**: POST uses `name`, GET returns both `customFieldName` and `name`.
54
+ 13. **Invoice/bill number is `reference`** — not `referenceNumber`.
55
+
56
+ ### Transaction Creation
57
+ 14. **`saveAsDraft`** defaults to `false` — omitting it creates a finalized transaction. Explicitly sending `saveAsDraft: true` creates a draft.
58
+ 15. **If `saveAsDraft: false`** (or omitted), every lineItem MUST have `accountResourceId`.
59
+ 16. **Phones MUST be E.164** — `+65XXXXXXXX` (SG), `+63XXXXXXXXXX` (PH). No spaces.
60
+
61
+ ### Chart of Accounts
62
+ 17. **Tax profiles pre-exist** — NEVER create them. Only GET and map.
63
+ 18. **Bank accounts are CoA entries** with `accountType: "Bank Accounts"`. A convenience endpoint `GET /bank-accounts` exists but returns a **flat array** `[{...}]` — NOT the standard paginated `{ data, totalElements, totalPages }` shape. Normalize before use.
64
+ 19. **CoA bulk-upsert wrapper is `accounts`** — not `chartOfAccounts`.
65
+ 20. **CoA POST uses `currency`** — not `currencyCode`. (Asymmetry — GET returns `currencyCode`.)
66
+ 21. **CoA POST uses `classificationType`** — GET returns `accountType`. Same values.
67
+ 22. **CoA code mapping: match by NAME, not code** — pre-existing accounts may have different codes. Resource IDs are the universal identifier.
68
+
69
+ ### Bulk Upsert (Items & Rates)
70
+ - **Items bulk-upsert** (`POST /items/bulk-upsert`) — max 500 per call. Provide `resourceId` per item to update (partial — only changed fields needed, server preserves existing values). Omit `resourceId` to create (defaults: `status=ACTIVE`, `itemCategory=NON_INVENTORY`). Response: `{ resourceId: null, resourceIds: [...] }`.
71
+ - **Rates bulk-upsert** (`POST /organization/currencies/rates/bulk-upsert`) — max 500 per call. Requires `rateDirection` per rate (`FUNCTIONAL_TO_SOURCE` or `SOURCE_TO_FUNCTIONAL`). **Auto-enables currencies not yet enabled in the org** — no need to call `add_currency` first. Response: `{ resourceId: null, resourceIds: [...] }`.
72
+
73
+ ### Journals & Cash
74
+ 23. **Journals use `journalEntries`** with `amount` + `type: "DEBIT"|"CREDIT"` — NOT `debit`/`credit` number fields.
75
+ 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": 1.35 }` (custom rate). Must be enabled for the org. Omit for base currency. 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.
76
+ 25. **`currency` object is the SAME everywhere** — invoices, bills, credit notes, AND journals all use `currency: { sourceCurrency: "USD", exchangeRate?: number }`. Never use `currencyCode: "USD"` (silently ignored on invoices/bills) or `currency: "USD"` (string — causes 400 on invoices/bills).
77
+ 26. **Cash entries use `accountResourceId`** at top level for the BANK account + `lines` array for offsets.
78
+
79
+ ### Credit Notes & Refunds
80
+ 27. **Credit note application wraps in `credits` array** with `amountApplied` — not flat.
81
+ 28. **CN refunds use the same Payment shape** as invoice/bill payments — `paymentAmount`, `transactionAmount`, `accountResourceId`, `paymentMethod`, `valueDate`, `reference`. The API also accepts aliases `refundAmount`/`refundMethod` (see Rule 53) but prefer canonical `paymentAmount`/`paymentMethod` for consistency.
82
+
83
+ ### Inventory Items
84
+ 29. **Inventory items require**: `unit` (e.g., `"pcs"`), `costingMethod` (`"FIXED"` or `"WAC"`), `cogsResourceId`, `blockInsufficientDeductions`, `inventoryAccountResourceId`. `purchaseAccountResourceId` MUST be Inventory-type CoA.
85
+ 30. **Delete inventory items via `DELETE /items/:id`** — not `/inventory-items/:id`.
86
+
87
+ ### Cash Transfers
88
+ 31. **Cash transfers use `cashOut`/`cashIn` sub-objects** — NOT flat `fromAccountResourceId`/`toAccountResourceId`. Each: `{ accountResourceId, amount }`.
89
+
90
+ ### Schedulers
91
+ 32. **Scheduled invoices/bills wrap in `{ invoice: {...} }` or `{ bill: {...} }`** — not flat. Recurrence field is `repeat` (NOT `frequency`/`interval`). `saveAsDraft: false` required. **`reference` is required** inside the `invoice`/`bill` wrapper — omitting it causes 422.
92
+ 33. **Scheduled journals use FLAT structure** with `schedulerEntries` — not nested in `journal` wrapper. **`valueDate` is required** at the top level (alongside `startDate`, `repeat`, etc.).
93
+
94
+ ### Bookmarks
95
+ 34. **Bookmarks use `items` array wrapper** with `name`, `value`, `categoryCode`, `datatypeCode`.
96
+
97
+ ### Custom Fields
98
+ 35. **Do NOT send `appliesTo` on custom field POST** — causes "Invalid request body". Only send `name`, `type`, `printOnDocuments`.
99
+ 35a. **Custom field values on transactions**: Set via `customFields: [{ customFieldName: "PO Number", actualValue: "PO-123" }]` on invoice/bill/customer-CN/supplier-CN/payment/item/fixed-asset create/update. NOT on journals, cash entries, or cash transfers. Read from GET responses in the same shape.
100
+ 35b. **Custom field search**: `POST /custom-fields/search` with filter/sort/limit/offset. Filter by `customFieldName` (StringExpression), `datatypeCode` (StringExpression: TEXT, DATE, DROPDOWN).
101
+ 35c. **Custom field GET**: `GET /custom-fields/:resourceId` returns full definition including `applyToSales`, `applyToPurchase`, `applyToCreditNote`, `applyToPayment`, `printOnDocuments`, `listOptions`.
102
+
103
+ ### Tags on Transactions
104
+ 35d. **Tags are `tags: string[]`** on ALL transaction create/update: invoices, bills, customer CNs, supplier CNs, journals, cash-in, cash-out, cash transfers. CLI uses `--tag <name>` (singular, wrapped to array). API accepts the array directly.
105
+
106
+ ### Nano Classifiers
107
+ 35e. **ClassifierConfig on line items**: `classifierConfig: [{ resourceId: "<capsuleTypeId>", type: "invoice"|"bill", selectedClasses: [{ className: "Class A", resourceId: "<classId>" }], printable: true }]`. Applies to line items on invoices, bills, credit notes, journal entries, and cash entry details. Create capsule types first via `POST /capsule-types`, then reference them in classifierConfig.
108
+
109
+ ### Reports
110
+ 36. **Report field names differ by type** — this is the most error-prone area:
111
+
112
+ | Report | Required Fields |
113
+ |--------|----------------|
114
+ | Trial balance | `startDate`, `endDate` |
115
+ | Balance sheet | `primarySnapshotDate` |
116
+ | P&L | `primarySnapshotDate`, `secondarySnapshotDate` |
117
+ | General ledger | `startDate`, `endDate`, `groupBy: "ACCOUNT"` (also `TRANSACTION`, `CAPSULE`) |
118
+ | Cashflow | `primaryStartDate`, `primaryEndDate` |
119
+ | Cash balance | `reportDate` |
120
+ | AR/AP report | `endDate` |
121
+ | AR/AP summary | `startDate`, `endDate` |
122
+ | Bank balance summary | `primarySnapshotDate` |
123
+ | Equity movement | `primarySnapshotStartDate`, `primarySnapshotEndDate` |
124
+ | Ledger highlights | *(none — simple GET)* |
125
+
126
+ 37. **Ledger highlights is a simple GET** — `GET /api/v1/ledger/highlights` returns org-wide GL summary metadata: transaction counts by type, date range, active accounts/currencies, cross-currency flag, and dynamic FX types. No parameters. Response dates are epoch ms (see Rule 52).
127
+ 37a. **Data exports use simpler field names**: P&L export uses `startDate`/`endDate` (NOT `primarySnapshotDate`). AR/AP export uses `endDate`.
128
+
129
+ ### Pagination
130
+ 38. **All list/search endpoints use `limit`/`offset` pagination** — NOT `page`/`size`. Default limit=100, offset=0. Max limit=1000, max offset=65536. `page`/`size` params are silently ignored. Response shape: `{ totalPages, totalElements, truncated, data: [...] }`. When `truncated: true`, a `_meta: { fetchedRows, maxRows }` field explains why (offset cap or `--max-rows` soft cap — default 10,000). Use `--max-rows <n>` to override. Always check `truncated` before assuming the full dataset was returned.
131
+
132
+ ### Other
133
+ 39. **Currency rates use `/organization-currencies/:code/rates`** — note the HYPHENATED path (NOT `/organization/currencies`). Enable currencies first via `POST /organization/currencies`, then set rates via `POST /organization-currencies/:code/rates` with body `{ "rate": 0.74, "rateApplicableFrom": "YYYY-MM-DD" }` (see Rule 49 for direction). Cannot set rates for org base currency. Full CRUD: POST (create), GET (list), GET/:id, PUT/:id, DELETE/:id.
134
+ 40. **FX invoices/bills MUST use `currency` object** — `currencyCode: "USD"` (string) is **silently ignored** (transaction created in base currency!). Use `currency: { sourceCurrency: "USD" }` to auto-fetch platform rate (ECB/FRANKFURTER), or `currency: { sourceCurrency: "USD", exchangeRate: 1.35 }` for a custom rate. Rate hierarchy: org rate → platform/ECB → transaction-level.
135
+ 41. **Invoice GET uses `organizationAccountResourceId`** for line item accounts — POST uses `accountResourceId`. Request-side aliases resolve `issueDate` → `valueDate`, `bankAccountResourceId` → `accountResourceId`, etc.
136
+ 42. **Scheduler GET returns `interval`** — POST uses `repeat`. (Response-side asymmetry remains.)
137
+ 43. **Search sort is an object** — `{ sort: { sortBy: ["valueDate"], order: "DESC" } }`. Required when `offset` is present (even `offset: 0`).
138
+ 44. **Bank records** — **Create**: Multipart CSV/OFX via `POST /magic/importBankStatementFromAttachment` or JSON via `POST /bank-records/:accountResourceId` with `{ records: [{amount, transactionDate, description?, payerOrPayee?, reference?}] }` (positive = cash-in, negative = cash-out, response: `{data: {errors: []}}`). **Search**: `POST /bank-records/:accountResourceId/search` — filter fields: `valueDate` (DateExpression), `status` (StringExpression: UNRECONCILED, RECONCILED, ARCHIVED, POSSIBLE_DUPLICATE), `description`, `extContactName` (payer/payee), `extReference`, `netAmount` (BigDecimalExpression), `extAccountNumber`. Sort by `valueDate` DESC default.
139
+ 45. **Withholding tax** on bills/supplier CNs only. Retry pattern: if `WITHHOLDING_CODE_NOT_FOUND`, strip field and retry.
140
+ 46. **Known API bugs (500s)**: Contact groups PUT (nil pointer on search response), custom fields PUT (dangling stack pointers in mapping), capsules POST (upstream returns nil), catalogs POST, inventory balances by status GET (`/inventory-balances/:status`, missing `c.Bind`) — all return 500.
141
+ 47. **Non-existent endpoints**: `POST /deposits`, `POST /inventory/adjustments`, `GET /payments` (list), and `POST /payments/search` return 404 — these endpoints are not implemented. To list/search payments, use `POST /cashflow-transactions/search` (the unified transaction ledger — see Rule 63).
142
+ 48. **Attachments — full CRUD**: **Add**: `POST /:type/:id/attachments` (multipart, `file` field, `application/pdf` or `image/*` — NOT `text/plain`). **List**: `GET /:type/:id/attachments`. **Delete**: `DELETE /:type/:id/attachments/:attachmentResourceId` (HTTP 200). CLI: `clio attachments add --file <path>` or `--url <url>`, `clio attachments list`, `clio attachments delete <attachmentResourceId>`. **Response shape is non-standard**: `{ reference, resourceId, attachments: [{fileName, fileType, fileId, attachmentResourceId}] }` — NOT `{ data: [...] }`. The attachment ID field is `attachmentResourceId` (not `resourceId`).
143
+ 49. **Currency rate direction: `rate` = functionalToSource (1 base = X foreign)** — POST `rate: 0.74` for a SGD org means 1 SGD = 0.74 USD. **If your data stores rates as "1 USD = 1.35 SGD" (sourceToFunctional), you MUST invert: `rate = 1 / 1.35 = 0.74`.** GET confirms both: `rateFunctionalToSource` (what you POSTed) and `rateSourceToFunctional` (the inverse).
144
+
145
+ ### Search & Filter
146
+ 50. **Search endpoint universal pattern** — All 28 `POST /*/search` endpoints share identical structure: `{ filter?, sort: { sortBy: ["field"], order: "ASC"|"DESC" }, limit: 1-1000, offset: 0-65536 }`. Sort is REQUIRED when offset is present (even `offset: 0`). Default limit: 100. `sortBy` is always an array on all endpoints (no exceptions). See `references/search-reference.md` for per-endpoint filter/sort fields.
147
+ 51. **Filter operator reference** — String: `eq`, `neq`, `contains`, `in` (array, max 100), `likeIn` (array, max 100), `reg` (regex array, max 100), `isNull` (bool). Numeric: `eq`, `gt`, `gte`, `lt`, `lte`, `in`. Date (YYYY-MM-DD): `eq`, `gt`, `gte`, `lt`, `lte`, `between` (exactly 2 values). DateTime (RFC3339): same operators, converted to epoch ms internally. Boolean: `eq`. JSON: `jsonIn`, `jsonNotIn`. Logical: nest with `and`/`or`/`not` objects, or use `andGroup`/`orGroup` arrays (invoices, bills, journals, credit notes).
148
+ 52. **Date format asymmetry (CRITICAL)** — Request dates: `YYYY-MM-DD` strings (all create/update and DateExpression filters). Request datetimes: RFC3339 strings (DateTimeExpression filters for `createdAt`, `updatedAt`, `approvedAt`, `submittedAt`). **ALL response dates**: `int64` epoch milliseconds — including `valueDate`, `createdAt`, `updatedAt`, `approvedAt`, `submittedAt`, `matchDate`. Convert: `new Date(epochMs).toISOString().slice(0,10)`. **Timezone convention**: ALL business dates (`valueDate`, `dueDate`, `startDate`, `endDate`, etc.) are in the **organization's timezone** — never UTC. The epoch ms stored in the DB represents the org-local date (no timezone conversion is ever needed). Only audit timestamps (`createdAt`, `updatedAt`, `action_at`) are UTC.
149
+ 53. **Field aliases on create endpoints** — Middleware transparently maps: `issueDate`/`date` → `valueDate` (invoices, bills, credit notes, journals). `name` → `tagName` (tags) or `internalName` (items). `paymentDate` → `valueDate`, `bankAccountResourceId` → `accountResourceId` (payments). `paymentAmount` → `refundAmount`, `paymentMethod` → `refundMethod` (credit note refunds). `accountType` → `classificationType`, `currencyCode` → `currency` (CoA). Canonical names always work; aliases are convenience only.
150
+ 54. **All search/list responses are flat** — every search and list endpoint returns `{ totalElements, totalPages, data: [...] }` directly (no outer `data` wrapper). Access the array via `response.data`, pagination via `response.totalElements`. **Two exceptions**: (a) `GET /bank-accounts` returns a plain array `[{...}]` (see Rule 18), (b) `GET /invoices/:id` returns a flat object `{...}` (no `data` wrapper) — unlike `GET /bills/:id`, `GET /contacts/:id`, `GET /journals/:id` which wrap in `{ data: {...} }`. Normalize the invoice GET response before use.
151
+ 55. **Scheduled endpoints support date aliases** — `txnDateAliases` middleware (mapping `issueDate`/`date` → `valueDate`) now applies to all scheduled create/update endpoints: `POST/PUT /scheduled/invoices`, `POST/PUT /scheduled/bills`, `POST/PUT /scheduled/journals`, `POST/PUT /scheduled/subscriptions`.
152
+ 56. **Kebab-case URL aliases** — `capsuleTypes` endpoints also accept kebab-case paths: `/capsule-types` (list, search, CRUD). `moveTransactionCapsules` also accepts `/move-transaction-capsules`. Both camelCase and kebab-case work identically.
153
+
154
+ ### Jaz Magic — Extraction & Autofill
155
+ 57. **When the user starts from an attachment, always use Jaz Magic** — if the input is a PDF, JPG, or any document image (invoice, bill, receipt), the correct path is `POST /magic/createBusinessTransactionFromAttachment`. Do NOT manually construct a `POST /invoices` or `POST /bills` payload from an attachment — Jaz Magic handles the entire extraction-and-autofill pipeline server-side: OCR, line item detection, contact matching, CoA auto-mapping via ML learning, and draft creation with all fields pre-filled. Only use `POST /invoices` or `POST /bills` when building transactions from structured data (JSON, CSV, database rows) where the fields are already known.
156
+ 58. **Two upload modes with different content types** — `sourceType: "FILE"` requires **multipart/form-data** with `sourceFile` blob (JSON body fails with 400 "sourceFile is a required field"). `sourceType: "URL"` accepts **application/json** with `sourceURL` string. The OAS only documents URL mode — FILE mode (the common case) is undocumented.
157
+ 59. **Three required fields + one optional**: `sourceFile` (multipart blob — NOT `file`), `businessTransactionType` (`"INVOICE"`, `"BILL"`, `"CUSTOMER_CREDIT_NOTE"`, or `"SUPPLIER_CREDIT_NOTE"` — `EXPENSE` rejected), `sourceType` (`"FILE"` or `"URL"`). Optional: `uploadMode` (`"SEPARATE"` default, or `"MERGED"` for a single PDF containing multiple documents — the backend splits it via boundary detection before extraction). All required fields are validated server-side. **CRITICAL: multipart form field names are camelCase** — `businessTransactionType`, `sourceType`, `sourceFile`, `uploadMode`, NOT snake_case. Using `business_transaction_type` returns 422 "businessTransactionType is a required field". The File blob must include a filename and correct MIME type (e.g. `application/pdf`, `image/jpeg`) — bare `application/octet-stream` blobs are rejected with 400 "Invalid file type".
158
+ 59a. **MERGED upload workflow tracking** — When `uploadMode: "MERGED"`, the upload response `workflowResourceId` is a **parent** tracking ID. The backend splits the PDF, then creates **child** workflows for each split page — these child IDs appear in `POST /magic/workflows/search` (by fileName or createdAt), NOT the parent ID. To track MERGED progress, search by `fileName` rather than the parent `workflowResourceId`.
159
+ 60. **Response maps transaction types**: Request `INVOICE` → response `SALE`. Request `BILL` → response `PURCHASE`. Request `CUSTOMER_CREDIT_NOTE` → response `SALE_CREDIT_NOTE`. Request `SUPPLIER_CREDIT_NOTE` → response `PURCHASE_CREDIT_NOTE`. S3 paths follow the response type. The response `validFiles[]` array contains `workflowResourceId` for tracking extraction progress via `POST /magic/workflows/search`.
160
+ 61. **Extraction is asynchronous** — the API response is immediate (file upload confirmation only). The actual Magic pipeline — OCR, line item extraction, contact matching, CoA learning, and autofill — runs asynchronously. Use `POST /magic/workflows/search` with `filter.resourceId.eq: "<workflowResourceId>"` to check status (SUBMITTED → PROCESSING → COMPLETED/FAILED). When COMPLETED, `businessTransactionDetails.businessTransactionResourceId` contains the created draft BT ID. The `subscriptionFBPath` in the response is a Firebase Realtime Database path for real-time status updates (alternative to polling).
161
+ 62. **Accepts PDF and JPG/JPEG** — both file types confirmed working. Handwritten documents are accepted at upload stage (extraction quality varies). `fileType` in response reflects actual format: `"PDF"`, `"JPEG"`.
162
+ 63. **Never use magic-search endpoints** — `GET /invoices/magic-search` and `GET /bills/magic-search` require a separate `x-magic-api-key` (not available to agents). Always use `POST /invoices/search` or `POST /bills/search` with standard `x-jk-api-key` auth instead.
163
+ 63b. **Workflow search tracks all magic uploads** — `POST /magic/workflows/search` searches across BT extractions AND bank statement imports. Filter by `resourceId` (eq), `documentType` (SALE, PURCHASE, SALE_CREDIT_NOTE, PURCHASE_CREDIT_NOTE, BANK_STATEMENT), `status` (SUBMITTED, PROCESSING, COMPLETED, FAILED), `fileName` (contains), `fileType`, `createdAt` (date range). Response: paginated `MagicWorkflowItem` with `businessTransactionDetails.businessTransactionResourceId` (the draft BT ID when COMPLETED) or `bankStatementDetails` (for bank imports). Standard search sort: `{ sortBy: ["createdAt"], order: "DESC" }`.
164
+
165
+ ### Cashflow & Unified Ledger
166
+ 64. **No standalone payments list/search** — `GET /payments`, `POST /payments/search`, and `GET /payments` do NOT exist. Per-payment CRUD (`GET/PUT/DELETE /payments/:resourceId`) exists for individual payment records, but to **list or search** payments, use `POST /cashflow-transactions/search` — the unified transaction ledger that spans invoices, bills, credit notes, journals, cash entries, and payments. Filter by `businessTransactionType` (e.g., `SALE`, `PURCHASE`) and `direction` (`PAYIN`, `PAYOUT`). Response dates are epoch milliseconds.
167
+ 65. **Contacts search uses `name`** — NOT `billingName`. The filter field for searching contacts by name is `name` (maps to `billingName` internally). Sort field is also `name`. Using `billingName` in a search filter returns zero results.
168
+
169
+ ### Response Shape Gotchas
170
+ 66. **Contact boolean fields are `customer`/`supplier`** — NOT `isCustomer`/`isSupplier`. These are plain booleans on the contact object: `{ "customer": true, "supplier": false }`. Using `isCustomer` or `isSupplier` in code will be `undefined`.
171
+ 67. **Finalized statuses differ by resource type** — NOT `"FINALIZED"`, `"FINAL"`, or `"POSTED"`. Journals → `"APPROVED"`. Invoices/Bills → `"UNPAID"` (progresses to `"PAID"`, `"OVERDUE"`). Customer/Supplier Credit Notes → `"UNAPPLIED"` (progresses to `"APPLIED"`). All types support `"DRAFT"` and `"VOIDED"`. When creating without `saveAsDraft: true`, the response status matches the type's finalized status.
172
+ 68. **Create/pay responses are minimal** — POST create endpoints (invoices, bills, journals, contacts, payments) return only `{ resourceId: "..." }` (plus a few metadata fields). They do NOT return the full entity. To verify field values after creation, you MUST do a subsequent `GET /:type/:resourceId`. Never assert on field values from a create response.
173
+ 69. **No `amountDue` field** — Invoices and bills do NOT have an `amountDue` field. To check if a transaction is fully paid, inspect the `paymentRecords` array: if `paymentRecords.length > 0`, payments exist. Compare `totalAmount` with the sum of `paymentRecords[].transactionAmount` to determine remaining balance.
174
+ 70. **Response dates include time component** — Even though request dates are `YYYY-MM-DD`, response dates are epoch milliseconds (see Rule 52). When comparing dates from responses, always convert with `new Date(epochMs).toISOString().slice(0, 10)` — never string-match against the raw epoch value. Remember: business dates are org-timezone (see Rule 52).
175
+ 71. **Items POST requires `saleItemName`/`purchaseItemName`** — When creating items with `appliesToSale: true` or `appliesToPurchase: true`, you MUST include `saleItemName` and/or `purchaseItemName` respectively. These are the display names shown on sale/purchase documents. Omitting them causes 422: "saleItemName is a required field". If not specified, default to the `internalName` value.
176
+ 72. **Items PUT requires `itemCode` + `internalName`** — Even for partial updates, `PUT /items/:id` requires both `itemCode` and `internalName` in the body. Omitting either causes 422. Use read-modify-write pattern: GET current item, merge your updates, PUT the full payload. Clio handles this automatically.
177
+ 73. **Capsules PUT requires `resourceId` + `capsuleTypeResourceId`** — Even for partial updates, `PUT /capsules/:id` requires `resourceId` and `capsuleTypeResourceId` in the body. Omitting either causes 422 or "Capsule type not found". Use read-modify-write pattern: GET current capsule, merge updates, PUT full payload. Clio handles this automatically.
178
+
179
+ ### Cash Entry Response Shape (CRITICAL)
180
+ 74. **Cash-in/out/transfer CREATE returns `parentEntityResourceId`** — The resourceId in the POST response (`{ data: { resourceId: "X" } }`) is the journal header's `parentEntityResourceId`. This ID is used for DELETE (`DELETE /cash-entries/X`). But it is **NOT** the same ID used for GET (`GET /cash-in-entries/:id`). GET expects the cashflow-transaction `resourceId` from the LIST response. Three different IDs exist per cash entry: `parentEntityResourceId` (from CREATE + in LIST), `resourceId` (cashflow-transaction ID, from LIST — use for GET), `businessTransactionResourceId` (underlying journal ID — do NOT use for anything).
181
+ 75. **Cash-in/out/transfer LIST/GET return cashflow-transaction shape** — NOT journal shape. Key field differences from journals: `transactionReference` (NOT `reference`), `transactionStatus` (NOT `status` — values: `ACTIVE`/`VOID`), `valueDate` is epoch ms (NOT ISO string), no `journalEntries` array, has `direction` (`PAYIN`/`PAYOUT`), has nested `account` object with bank name, has `businessTransactionType` (`JOURNAL_DIRECT_CASH_IN`/`JOURNAL_DIRECT_CASH_OUT`/`JOURNAL_CASH_TRANSFER`).
182
+ 76. **Cash-in/out/transfer search uses `/cashflow-transactions/search`** — Filter by `businessTransactionType: { eq: "JOURNAL_DIRECT_CASH_IN" }` (or `JOURNAL_DIRECT_CASH_OUT` or `JOURNAL_CASH_TRANSFER`). Other useful filters: `organizationAccountResourceId` (bank account), `businessTransactionReference` (reference), `valueDate` (date range). The search endpoint is shared across all cashflow transaction types.
183
+ 77. **DELETE for cash entries uses `/cash-entries/:id`** — NOT the individual resource paths. The ID used is the `parentEntityResourceId` (= the resourceId returned by CREATE). This is a shared endpoint for all cash entry types (cash-in, cash-out, cash-transfer).
184
+
185
+ ### Entity Resolution (Fuzzy Matching)
186
+ 78. **`--contact`, `--account`, and `--bank-account` accept names** — any CLI flag that takes a contact, chart of accounts entry, or bank account accepts EITHER a UUID resourceId OR a fuzzy name. Examples: `--contact "ACME Corp"`, `--account "DBS Operating"`, `--bank-account "Business"`. The CLI auto-resolves to the best match (strict thresholds) and shows the resolved entity on stderr. UUIDs are passed through without API calls. If the match is ambiguous, the CLI errors with a list of candidates — never silently picks the wrong entity.
187
+ 79. **`capsule-transaction` recipes auto-resolve accounts** — when `--input` is omitted, the CLI searches the org's chart of accounts for each blueprint account name (e.g., "Interest Expense", "Loan Payable"). If all accounts resolve with high confidence, no JSON mapping file is needed. If any fail, the error message shows exactly which accounts could not be found and suggests close matches. `--contact` and `--bank-account` on recipes also accept names.
188
+ 80. **Payment/refund account filter is conditional on `--method`** — for BANK_TRANSFER, CASH, and CHEQUE, the `--account` resolver filters to bank/cash accounts only. For other payment methods, all account types are considered.
189
+
190
+ ### Draft Finalization Pipeline (Convert & Next)
191
+
192
+ The `clio bills draft` subcommand group enables the full "review → fill missing → convert" workflow that mirrors the Jaz UI's "Convert and Next" button. Designed for AI agents processing a queue of draft bills.
193
+
194
+ #### Commands
195
+
196
+ | Command | Purpose |
197
+ |---------|---------|
198
+ | `clio bills draft list [--ids <ids>] [--json]` | Queue view: all drafts with per-field validation + attachment count |
199
+ | `clio bills draft finalize <id> [flags] [--json]` | Fill missing fields + convert DRAFT → UNPAID in one PUT |
200
+ | `clio bills draft attachments <id> [--json]` | List attachments with download URLs for agent inspection |
201
+
202
+ #### Mandatory Fields for Bill Finalization
203
+
204
+ | Field | JSON Path | CLI Flag | Resolver |
205
+ |-------|-----------|----------|----------|
206
+ | Contact | `contactResourceId` | `--contact <name/UUID>` | Fuzzy resolved |
207
+ | Bill date | `valueDate` | `--date <YYYY-MM-DD>` | Literal |
208
+ | Due date | `dueDate` | `--due <YYYY-MM-DD>` | Literal |
209
+ | Line items | `lineItems` (non-empty) | `--lines <json>` | — |
210
+ | Item name | `lineItems[i].name` | via `--lines` | — |
211
+ | Item price | `lineItems[i].unitPrice` | via `--lines` | — |
212
+ | Item account | `lineItems[i].accountResourceId` | `--account <name/UUID>` (bulk) | Fuzzy resolved |
213
+
214
+ Optional: `--ref`, `--notes`, `--tag`, `--tax-profile <name/UUID>` (bulk, fuzzy resolved), `--tax`, `--tax-inclusive`, `--dry-run`, `--input <file>`.
215
+
216
+ #### Agent Workflow Pattern
217
+
218
+ ```
219
+ Step 1: clio bills draft list --json
220
+ → Batch queue: every DRAFT with per-field validation + attachment count
221
+
222
+ Step 2: For each draft where ready = false:
223
+ a) Read validation.missingFields from Step 1 output
224
+ b) Optional: clio bills draft attachments <id> --json
225
+ → Download fileUrl, read PDF/image, extract or verify values
226
+ c) Resolve values (ask user, or infer from attachment + context)
227
+ d) clio bills draft finalize <id> --contact "Acme" --date 2025-01-15 ... --json
228
+ → Updates + converts to UNPAID in one PUT (Rule 67: bills/invoices → UNPAID, journals → APPROVED)
229
+
230
+ Step 3: For each draft where ready = true:
231
+ clio bills draft finalize <id> --json
232
+ → Converts directly (all mandatory fields already present)
233
+ ```
234
+
235
+ 81. **`--account` bulk patches line items** — when used with `clio bills draft finalize`, `--account` resolves the name to a UUID then sets `accountResourceId` on EVERY line item where it's currently null. Existing accounts are NOT overwritten. Same for `--tax-profile`. `--lines` takes priority (full replacement).
236
+ 82. **`--dry-run` validates without modifying** — returns the same validation structure as `draft list` (per-field status/hint), so agents can preview what would happen before committing. No API write occurs.
237
+ 83. **Finalization is a single PUT** — `updateBill()` with `saveAsDraft: false` transitions DRAFT → UNPAID (per Rule 67) and updates all fields in one call. No delete-and-recreate. The CLI handles all field normalization automatically (date format, line item sanitization, account field name mapping).
238
+ 84. **Draft list attachment count** — `draft list` includes `attachmentCount` per draft (from `GET /bills/:id/attachments`). Use `draft attachments <id>` for full details including `fileUrl` download links.
239
+ 85. **PUT body requires `resourceId`** — The UpdateBill PUT endpoint requires `resourceId` in the body (in addition to the URL path). Dates must be `YYYY-MM-DD` (not ISO with time). `taxInclusion` is boolean (`true`/`false`), not string. Line items must use `accountResourceId` (not `organizationAccountResourceId` from GET).
240
+ 86. **GET→PUT field asymmetry** — GET returns `organizationAccountResourceId` on line items; PUT requires `accountResourceId`. GET returns dates as `2026-02-27T00:00:00Z`; PUT requires `2026-02-27`. GET returns `taxProfile: { resourceId }` object; PUT requires `taxProfileResourceId` string. The CLI `draft finalize` command normalizes all of these automatically.
241
+ 87. **Magic workflow status may be null immediately after creation** — The `POST /magic/workflows/search` endpoint may return a workflow with `status: null` right after `POST /magic/create-from-attachment`. Allow 2-3 seconds before polling, or default to `SUBMITTED`. The CLI `magic status` command defaults null status to `SUBMITTED`.
242
+ 88. **Finalized invoices/bills need `accountResourceId` on all line items** — When `saveAsDraft: false` (or using `--finalize`), every `lineItems[i].accountResourceId` must be set. Omitting it causes 422: "lineItems[0].accountResourceId is required if [saveAsDraft] is false". The CLI validates this pre-flight.
243
+
244
+ #### DRY Extension Pattern
245
+
246
+ Bills, invoices, and credit notes share identical mandatory field specs. Adding `clio invoices draft` or `clio customer-credit-notes draft` later reuses all validation, formatting, and CLI flag logic from `draft-helpers.ts` — only the API calls differ.
247
+
248
+ ### Bank Rules
249
+ 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 }`.
250
+ 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`.
251
+ 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.
252
+ 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).
253
+
254
+ ### Fixed Assets
255
+ 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.
256
+ 92. **Fixed asset disposal/sale/transfer use different endpoint patterns** — Discard: `POST /discard-fixed-assets/:id` (body includes `resourceId` + dates). Mark sold: `POST /mark-as-sold/fixed-assets` (body-only, no path param). Transfer: `POST /transfer-fixed-assets` (body-only). Undo: `POST /undo-disposal/fixed-assets/:id`.
257
+ 92a. **Two ways to register fixed assets** — (1) **Create** (`POST /fixed-assets`): for assets purchased via a bill or journal already in the system. ACTIVE assets require `purchaseBusinessTransactionType` (`PURCHASE` or `JOURNAL_MANUAL`) and `purchaseBusinessTransactionResourceId`. (2) **Transfer** (`POST /transfer-fixed-assets`): for pre-existing assets purchased before using Jaz or outside the system. Accepts `bookValueAccumulatedDepreciationAmount` for depreciation already incurred. No linked transaction needed.
258
+ 92b. **`saveAsDraft` defaults to `true`** — To create an ACTIVE fixed asset, pass `saveAsDraft: false` with ALL required fields: `name`, `category`, `typeCode`, `purchaseAmount`, `purchaseDate`, `purchaseAssetAccountResourceId`, `depreciationMethod`, `effectiveLife`, and for `STRAIGHT_LINE`: `depreciationStartDate`, `accumulatedDepreciationAccountResourceId`, `depreciationExpenseAccountResourceId`. Omitting any returns 422.
259
+ 92c. **Valid enums** — `depreciationMethod`: `STRAIGHT_LINE`, `NO_DEPRECIATION`. `category`: `TANGIBLE`, `INTANGIBLE`. Optional string fields (`purchaseBusinessTransactionResourceId`, `accumulatedDepreciationAccountResourceId`, `capsuleResourceId`) can be safely omitted — the API ignores empty values.
260
+
261
+ ### Subscriptions & Scheduled Transactions
262
+ 93. **Subscription endpoints are under `/scheduled/subscriptions`** — List, GET, POST, PUT, DELETE all at `/api/v1/scheduled/subscriptions[/:id]`. Cancel is **PUT** (not POST) at `/api/v1/scheduled/cancel-subscriptions/:id` (different path pattern). **Subscriptions are invoices only** (SALE) — no bills. Different from scheduled invoices: subscriptions auto-prorate partial periods (generate credit notes for mid-period changes), but currency/tax/account are immutable after creation. Use scheduled invoices for fixed-amount recurring invoices where you need per-occurrence flexibility. **All subscription CRUD requires `proratedConfig: { proratedAdjustmentLineText: string }`** — Clio auto-injects this; do not add manually. **`repeat` is required on POST** (valid: `ONE_TIME`, `DAILY`, `WEEKLY`, `MONTHLY`, `YEARLY`) — Clio maps from the `interval` parameter. Cancel requires `cancelDateType` (`END_OF_CURRENT_PERIOD`, `END_OF_LAST_PERIOD`, `CUSTOM_DATE`) + `proratedAdjustmentLineText` + `resourceId` in body. Must cancel before delete. `businessTransactionType` is NOT in the OAS — the API ignores it.
263
+ 94. **Scheduled transaction search does NOT support `createdAt` sort** — `POST /scheduled-transaction/search` sort fields: `startDate`, `nextScheduleDate`, etc. Default to `startDate` DESC. This is a cross-entity search across all scheduled types (invoices, bills, journals, subscriptions). Filter by `businessTransactionType` (SALE, PURCHASE, JOURNAL) and/or `schedulerType` (RECURRING, SUBSCRIPTION) to narrow results.
264
+
265
+ ### Universal Search
266
+ 95. **Universal search uses `query` param (NOT `q`)** — `GET /search?query=<term>` returns categorized results across contacts, invoices, bills, credit notes, journals. Response is a flat object with category keys, each containing an array of matches. No pagination — returns top matches per category.
267
+
268
+ ### Contact Groups
269
+ 96. **Contact groups have `associatedContacts` array** — Each group contains `{ name, resourceId, associatedContacts: [{ name, resourceId }] }`. Search via `POST /contact-groups/search`. Known bug: PUT returns 500 (Rule 46).
270
+
271
+ ### Inventory
272
+ 97. **Inventory balance uses `GET /inventory-item-balance/:itemResourceId`** — Returns `{ itemResourceId, latestAverageCostAmount, baseQty, baseUnit }`. Note: this is the ITEM resourceId, not an inventory-specific ID. The `/inventory-balances/:status` endpoint returns 500 (Rule 46).
273
+
274
+ ### Withholding Tax
275
+ 98. **Withholding tax codes via `GET /withholding-tax-codes`** — Returns a flat array of 1,360+ entries (PH PSIC codes). Each entry: `{ code, description, taxRate, ... }`. No pagination — full list in one call. Use for PH/SG tax compliance.
276
+ 99. **Duplicate detection fields** — API rejects duplicates with 422: Contacts on `name` (NOT `billingName`), Items on `itemCode`, Accounts on `name`, Tax Profiles on `name`. Agent tools auto-search before creating — if a match is found, the existing entity is returned instead of hitting a 422.
277
+
278
+ ### Tax Profile Scoping
279
+ 100. **Tax profiles have `appliesToSale`/`appliesToPurchase` scope** — A sales-only tax profile used on a bill causes 422. Always filter by transaction type when selecting: `search_tax_profiles` accepts `appliesTo` param (`sale`, `purchase`, `sale_credit_note`, `purchase_credit_note`). Invoices → `sale`, Bills → `purchase`.
280
+
281
+ ### Cash Entry PUT Requirements
282
+ 101. **Cash entry PUT requires `accountResourceId` + `resourceId`** — `PUT /cash-in-entries/:id` and `PUT /cash-out-entries/:id` require both `accountResourceId` (bank account) and `resourceId` in the body. Omitting `accountResourceId` causes 500. `accountEntryResourceId` is optional (auto-populated).
283
+
284
+ ### Cash Entry Account Type
285
+ 102. **Cash-in/out `accountResourceId` must be a Bank Accounts type** — Using expense, revenue, or other non-bank accounts causes 422 `CASH_OUT_ACCOUNT_TYPE_NOT_ALLOWED` (or equivalent for cash-in). Use `list_bank_accounts` or `search_accounts` with `accountType: "Bank Accounts"` to find valid accounts.
286
+
287
+ ### Journals
288
+ 103. **Journal entries must balance** — Sum of all DEBIT amounts must exactly equal sum of all CREDIT amounts. Unbalanced journals are rejected with 422. Agent tools pre-flight check this client-side before hitting the API.
289
+
290
+ ### Transaction References
291
+ 104. **Invoice/bill/CN references must be unique per org** — Creating a transaction with a `reference` that already exists causes 422 `Sale Reference already exists` (or `Purchase Reference`). Generate unique references with timestamps (e.g., `INV-20260309-1430`) when the user doesn't specify one.
292
+
293
+ ### Currency Rates
294
+ 105. **`add_currency_rate` for new rates, `update_currency_rate` only for editing existing records** — When a user says "update the rate" or "set the rate", use `add_currency_rate` (POST — creates a new rate entry for a date). Only use `update_currency_rate` (PUT) when explicitly modifying an existing rate record by its resourceId.
295
+ 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.
296
+
297
+ ### Quick Fix (Bulk Update)
298
+ 107. **20 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 — check `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. **Line-item request patterns**: ARAP + accounting use `{ lineItemResourceIds, attributes }`. 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.
299
+
300
+ ### Transfer Trial Balance
301
+ 108. **Transfer Trial Balance** (`POST /api/v1/transfer-trial-balance`) creates opening balance entries. Uses `journalEntries` (NOT `lines` — this is a journal type). Always ACTIVE (no draft mode), reference auto-generated as "Transfer Trial Balance", minimum 1 entry, entries cannot have 0 amounts, skips lock date validation. **`valueDate` must be today or in the past** — future dates are rejected with "Opening data cannot be future date". Each entry: `{ accountResourceId, type: "DEBIT"|"CREDIT", amount }`.
302
+
303
+ ### Scheduler Dynamic Strings
304
+ 109. **Scheduler placeholder strings** — All scheduled transactions (invoices, bills, journals, subscriptions) support dynamic strings in any free text field (`reference`, line item `name`, `notes`). Strings are replaced with values relative to the **transaction date**: `{{Day}}` → day name (Monday), `{{Date}}` → full date (09 Mar 2026), `{{Date+X}}` → date + X days, `{{DateRange:X}}` → date range spanning X days (min 1, max 999), `{{Month}}` → month name (March), `{{Month+X}}` → month + X months, `{{MonthRange:X}}` → month range spanning X months, `{{Year}}` → year (2026), `{{Year+X}}` → year + X years. Example: `reference: "INV-{{Month}}-{{Year}}"` → `"INV-March-2026"` for a March transaction.
305
+
306
+ ### Bank Rule Dynamic Strings
307
+ 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}}"`.
308
+
309
+ ### Quick Fix Tag Field
310
+ 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]`.
311
+
312
+ ### Sub-Resource Response Shapes
313
+ 112. **Invoice/bill payment & credit sub-resources return raw arrays** — `GET /invoices/:id/payments` and `GET /bills/:id/payments` return `[{paymentRecord}, ...]` — NOT `{data: [...]}`. Same for `GET /invoices/:id/credits` and `GET /bills/:id/credits`. The CLI wraps these into `{data: [...]}` for consistency. `DELETE /invoices/:id/credits/:creditsAppliedResourceId` reverses a credit application.
314
+
315
+ ### Nano-Classifier API
316
+ 113. **Nano-classifier API gotchas** — CREATE uses `classes: string[]` (NOT `classNames` or `[{className}]`). `printable: boolean` is required — defaults to `false` (most classifiers are not printable). GET single is double-wrapped: `{data: {data: [...], totalElements, totalPages}}` — extract the first element from the inner paginated response. GET/LIST response returns classes as `[{className, resourceId}]` (objects), while CREATE accepts plain `string[]`.
317
+
318
+ ### Scheduler Response Asymmetry
319
+ 114. **Scheduler response uses `interval`, not `repeat`** — POST/PUT uses `repeat` field (values: `WEEKLY`, `MONTHLY`, `QUARTERLY`, `YEARLY`). GET response returns `interval` field (same values). PUT accepts the full transaction template (`invoice`, `bill`, or journal entries at top level), not just schedule metadata — same structure as POST.
320
+
321
+ ### Payment Record CRUD
322
+ 115. **Payment record CRUD** — `GET /payments/:resourceId` returns `{data: PaymentRecord}` (wrapped). Payment resourceIds come from invoice/bill GET response → `paymentRecords[].resourceId`. **Cashflow transaction IDs ≠ payment IDs** — don't mix them. `POST /cashflow-transactions/search` returns cashflow IDs, while payment CRUD uses separate payment IDs from the parent document.
323
+
324
+ 116. **PaymentMethod accepts 11 values** — All payment endpoints (invoices, bills, credit note refunds, payment updates) accept: `CASH`, `BANK_TRANSFER`, `CREDIT_CARD`, `CHEQUE`, `E_WALLET`, `WITHHOLDING_TAX_CERTIFICATE`, `CLEARING_SETTLEMENT`, `DEBT_WRITE_OFF`, `INTER_COMPANY`, `OTHER`, `PAYMENT_GATEWAY`. Default is `BANK_TRANSFER`. The OAS previously listed only 7 — the API runtime already accepted all 11.
325
+ 117. **Fixed asset sale accepts PURCHASE type** — `saleBusinessTransactionType` in mark-as-sold accepts `SALE`, `PURCHASE`, or `JOURNAL_MANUAL`. Use `PURCHASE` when the disposal is linked to a purchase-side transaction (e.g., trade-in).
326
+
327
+ ## Supporting Files
328
+
329
+ For detailed reference, read these files in this skill directory:
330
+
331
+ - **[references/search-reference.md](./references/search-reference.md)** — Complete search/filter/sort reference for all 28 search endpoints — per-endpoint filter fields, sort fields, operator types
332
+ - **[references/endpoints.md](./references/endpoints.md)** — Full API endpoint reference with request/response examples
333
+ - **[references/errors.md](./references/errors.md)** — Complete error catalog: every error, cause, and fix
334
+ - **[references/field-map.md](./references/field-map.md)** — Complete field name mapping (what you'd guess vs actual), date format matrix, middleware aliases
335
+ - **[references/dependencies.md](./references/dependencies.md)** — Resource creation dependencies and required order
336
+ - **[references/full-api-surface.md](./references/full-api-surface.md)** — Complete endpoint catalog (80+ endpoints), enums, search filters, limits
337
+ - **[references/feature-glossary.md](./references/feature-glossary.md)** — Business context per feature — what each feature does and why, extracted from [help.jaz.ai](https://help.jaz.ai)
338
+ - **[help-center-mirror/](./help-center-mirror/)** — Full help center content split by section (auto-generated from [help.jaz.ai](https://help.jaz.ai))
339
+
340
+ ## Help Center Knowledge Base (`clio help-center` / `clio hc`)
341
+
342
+ For product questions (how-to, feature behavior, troubleshooting), use `clio help-center` instead of reading raw help-center-mirror files:
343
+
344
+ ```bash
345
+ clio help-center "how to apply credit note" # search help center
346
+ clio help-center "bank recon" --limit 3 # limit results
347
+ clio help-center "scheduled invoices" --section invoices # filter by section
348
+ ```
349
+
350
+ Supports `--json` for structured output. 186 articles across 20 sections. Automatically uses hybrid search (embeddings + keyword) when available, falls back to keyword + synonym expansion offline.
351
+
352
+ **When to use `clio help-center` vs reading raw files:**
353
+ - Use `clio help-center` when you need specific answers (returns only relevant articles, saves context)
354
+ - Read `help-center-mirror/*.md` directly only when you need to scan an entire section comprehensively
355
+
356
+ ## Recommended Client Patterns
357
+
358
+ - **Starting from an attachment?** → Use Jaz Magic (`POST /magic/createBusinessTransactionFromAttachment`). Never manually parse a PDF/JPG to construct `POST /invoices` or `POST /bills` — let the extraction & autofill pipeline handle it.
359
+ - **Starting from structured data?** → Use `POST /invoices` or `POST /bills` directly with the known field values.
360
+ - **Serialization (Python)**: `model_dump(mode="json", by_alias=True, exclude_unset=True, exclude_none=True)`
361
+ - **Field names**: All request bodies use camelCase
362
+ - **Date serialization**: Python `date` type → `YYYY-MM-DD` strings
363
+ - **Bill payments**: Embed in bill creation body (safest). Standalone `POST /bills/{id}/payments` also works.
364
+ - **Bank records**: Create via JSON `POST /bank-records/:id` or multipart `POST /magic/importBankStatementFromAttachment`. Search via `POST /bank-records/:id/search` with filters (valueDate, status, description, extContactName, netAmount, extReference).
365
+ - **Scheduled invoices/bills**: Wrap as `{ status, startDate, endDate, repeat, invoice/bill: { reference, valueDate, dueDate, contactResourceId, lineItems, saveAsDraft: false } }`. `reference` is required.
366
+ - **Scheduled journals**: Flat: `{ status, startDate, endDate, repeat, valueDate, schedulerEntries, reference }`. `valueDate` is required.
367
+ - **FX currency (invoices, bills, credit notes, AND journals)**: `currency: { sourceCurrency: "USD" }` (auto-fetches platform rate) or `currency: { sourceCurrency: "USD", exchangeRate: 1.35 }` (custom rate). Same object form on all transaction types. **Never use `currencyCode` string** — silently ignored.
368
+
369
+ ## See Also
370
+
371
+ - **jaz-recipes** — 16 IFRS-compliant transaction recipes with journal entries, capsules, and calculators
372
+ - **jaz-jobs** — 12 accounting job playbooks (month-end close, bank recon, GST/VAT filing, etc.)
373
+ - **jaz-conversion** — Data migration workflows from Xero, QuickBooks, Sage, MYOB, and Excel
374
+ - **jaz-cli** — CLI command reference, auth, output formats, pagination, and workflow patterns
@@ -0,0 +1,142 @@
1
+ ### Agent Builder
2
+ Source: https://help.jaz.ai/en/articles/10631219-agent-builder
3
+
4
+ **Q1. What is an AI Agent?**
5
+
6
+ - Jaz’s AI Agent allows you to send emails to perform accounting and finance tasks for your organizations.
7
+ - All actions taken by your agent are recorded as your own in Jaz.
8
+ - Agent tasks follow your user permissions and execute actions on your behalf.
9
+
10
+ **Q2. How do I set up my AI Agent?**
11
+
12
+ - Head over to Settings > Agent Builder and set the following according to your preferences:
13
+ - Name
14
+ - Email
15
+ - Create an agent's email using letters (a-z), numbers (0-9), and the plus (+) symbol.
16
+ - Using the plus (+) symbol is a good way to differentiate agents per organization, for example: [myagent+greengrocery@sendjaz.com](mailto:myagent+greengrocery@sendjaz.com)
17
+ - Tone
18
+ - Friendly
19
+ - Formal
20
+ - Focused
21
+ - Skill Level
22
+ - Assistant
23
+ - Analyst (Growth Plan only)
24
+ - Associate (Coming soon)
25
+ - Memory
26
+ - Predefined
27
+ - Progressive (Growth Plan only)
28
+ - Preferred Language
29
+
30
+ **Q3. What tasks can the AI Agent perform?**
31
+
32
+ The AI Agent can perform the following functions for paid organizations:
33
+ - Bookmarks
34
+ - Create, review, and manage bookmarks.
35
+ - Chart of Accounts
36
+ - Create, update, and search accounts and types.
37
+ - Contacts & Items
38
+ - Create, update, and search contacts and items.
39
+ - Currency Management
40
+ - Add, update, and retrieve currencies and exchange rates.
41
+ - Draft Transactions
42
+ - Create draft invoices, bills, and journals.
43
+ - Jaz Magic (Invoices & Bills)
44
+ - Autofill invoice and bill drafts from emails or attachments.
45
+ - Reports & Data Exports
46
+ - Generate balance sheets, P&L, cash flow, and other reports.
47
+ - Tax Profiles
48
+ - Create tax profiles.
49
+ - Direct Cash Transactions
50
+ - Record direct cash inflows, outflows, or transfers.
51
+ - Note: Only available for organizations under Growth Plan.
52
+ - Updates, Voids, & Deletes
53
+ - Modify or void transactions, contacts, or accounts.
54
+ - Note: Only available for organizations under Growth Plan.
55
+
56
+ **Q4. How does the agent receive instructions?**
57
+
58
+ - Send tasks via email to your agent's assigned email address.
59
+ - Use the ‘To’ field for direct actions and replies.
60
+ - Use ‘Cc’ to keep the agent informed but it will only respond to your verified email.
61
+
62
+ **Q5. Can the AI Agent reply to emails with other recipients?**
63
+
64
+ - No, it only responds to your verified email for security reasons.
65
+
66
+ **Q6. What happens when I update my agent's email?**
67
+
68
+ - Updating your agent’s email cancels all ongoing actions and the previous email will be unavailable for up to 72 hours.
69
+
70
+ **Q7. What happens if I cancel or downgrade my organization plan?**
71
+
72
+ - Your agent will be deactivated and its email will be released.
73
+
74
+ **Q8. Why am I not receiving responses from my agent?**
75
+
76
+ - Ensure you've included instructions in the ‘To**’** field and the email body.
77
+ - Make sure the agent's email is in your email contacts.
78
+ - Whitelist @sendjaz.com (@sendjaz.com), and check spam or other folders.
79
+
80
+ **Q9. Why can’t I add new instructions to the AI Agent?**
81
+
82
+ - Only organizations under the Growth Plan can add new instructions and turn off specific workflows.
83
+
84
+ **Q10. Is it possible to whitelist external email addresses for my agent builder?**
85
+
86
+ - Yes. You can whitelist specific email addresses or domains in your agent builder.
87
+ - Whitelisting allows your agent to CC email addresses in replies, only when these addresses or domains were in your original email to the agent.
88
+
89
+ ---
90
+
91
+ ### Clio
92
+ Source: https://help.jaz.ai/en/articles/10631206-clio
93
+
94
+ **Q1. What is Clio?**
95
+
96
+ - Clio stands for **Command Line Interface Operator**designed to help with accounting and finance tasks on Jaz.
97
+
98
+ **Q2. Is Clio available to all users?**
99
+
100
+ - No, Clio is available only for paid organizations.
101
+
102
+ **Q3. Can I use Clio on the Jaz mobile app?**
103
+
104
+ - Yes, Clio is available on Android (soon for IOS). Go to **Home > Clio AI Support** to access it.**Q4. How does Clio process queries?**
105
+
106
+ - It processes all queries in real-time and does not retain personal or query-related data unless explicitly saved in accounting records or reports.
107
+
108
+ **Q5. What happens when I log out or switch organizations?**
109
+
110
+ - Clio is session-based, meaning it resets when you log out, close the tab, or switch organizations. Chat history is not retained.
111
+
112
+ **Q6. Can Clio handle multiple tasks at once?**
113
+
114
+ - Yes, Clio can process multiple tasks in a single query.
115
+
116
+ **Q7. Are there any restrictions on Clio’s capabilities?**
117
+
118
+ - Yes, Clio's functionality is limited to tasks and features within the Jaz ecosystem.
119
+
120
+ - Its functions are also limited to the user’s access permissions within an organization (e.g., a user without report access cannot generate reports).
121
+
122
+ **Q8. Does Clio store my chat history?**
123
+
124
+ - No, users cannot download or export chat history.
125
+
126
+ **Q9. What happens when I edit a sent query?**
127
+
128
+ - Editing a query replaces the previous one instead of updating it.
129
+
130
+ **Q10. What file formats does Clio support?**
131
+
132
+ - Clio supports all file formats that are compatible within Jaz. This includes:
133
+ - PDFs
134
+ - .xlsx
135
+ - JPG/JPEG
136
+ - PNG
137
+
138
+ **Q11. What languages does Clio support?**
139
+
140
+ - Both chat and voice queries support **all languages** available in Jaz.
141
+
142
+ ---
@@ -0,0 +1,68 @@
1
+ ### Approvals
2
+ Source: https://help.jaz.ai/en/articles/8938045-approvals
3
+
4
+ **Q1. What business transactions can I submit for approval?**
5
+
6
+ - You can submit the following business transactions to go through an approval flow:
7
+ - Invoices
8
+ - Bills
9
+
10
+ **Q2. What is the approval flow?**
11
+
12
+ - Once you submit a record for approval it can be either -
13
+ - **Submitted for approval** - The record will again be in the**For Approval** state and will need to be converted to active.
14
+ - **Saved as a draft**- The record will be saved as a draft, and will need to be converted to active.
15
+ - **Converted to active**- The record will be in the active state.
16
+ - A record in the draft state can also be submitted for approval.
17
+
18
+ **Q3. How do I send an Invoice/Bill record for approval?**
19
+
20
+ - After filling in the invoice/bill details and **Submit for Approval.Q4. Can I make changes to the Invoice/Bill record after it has been sent for approval?**
21
+
22
+ - Yes, you can make changes to the Invoice/Bill record by editing the record.
23
+ - You can then choose to resubmit it for approval, convert it to draft, or convert it to active depending on your permission level. For more information about user permissions, refer to [User Management.](https://help.jaz.ai/en/articles/9066648-user-management)
24
+
25
+ **Q5. Who can submit an invoice/bill for approval?**
26
+
27
+ - All users in Jaz can submit and Invoice/Bill for approval, regardless of their role & permissions.
28
+
29
+ **Q6. Who is allowed to approve the invoices/bills?**
30
+
31
+ - Admins can approve invoices/bills that are submitted for approvals.
32
+ - Any user in the organization will be able to submit a record for approval, but only admins can approve the records and convert them to active.
33
+
34
+ **Q7. Can I make changes to the invoice/bill record before approving it?**
35
+
36
+ - Yes, you can update the invoice/bill before approving it.
37
+ - The name of the last user who updated the record will be shown under the **Last Updated By**field.
38
+
39
+ **Q8. How to approve a record submitted for approval?**
40
+
41
+ - All the records submitted for approval are in the Approval state, and not yet active.
42
+ - Approve the record from the details screen or by converting the record to active.
43
+
44
+ **Q9. What happens to the invoice/bill after it is approved?**
45
+
46
+ - Once a record is approved, it becomes active and will affect your financial reports.
47
+ - If the due date of the record is later than the approval date, its status will be updated to **Payment Due.**The invoice/bill can be found under the **Active**tab in the invoice/bill menu.
48
+ - If the due date of the record is before the approval date, its status will be Overdue. The invoice/bill can then be found under the **Overdue** tab in the invoice/bill menu.**Q10. What happens if I do not approve an invoice/bill record?**
49
+
50
+ - If you do not approve an invoice or bill, the record continues to be under the **For Approval** tab and will not contribute or affect financial reports.**Q11. Will approving an invoice/bill affect my financial records?**
51
+
52
+ - Yes, the approved invoice/bill will be reflected in your financial reports, such as the General Ledger.
53
+
54
+ **Q12. Is there a deadline for approving an invoice/bill?**
55
+
56
+ - No, you can approve the invoice/bill anytime.
57
+
58
+ **Q13. How can I view invoice/bill records that need to be approved?**
59
+
60
+ - You can find all the invoice/bill records that need to be approved under the **For Approval** tab.**Q14. Can I delete an invoice/bill sent for approval?**
61
+
62
+ - Yes, you can delete an invoice/bill that is pending approval.
63
+
64
+ **Q15. Why can't I see the "For Approval" tab?**
65
+
66
+ - If you do not have any records currently submitted for approval, the **For Approval** tab will be hidden.
67
+
68
+ ---