Journal Entry bulk import — sheet format & AI prompt
Generate LUCA-ready journal-entry spreadsheets from your own tooling or an AI assistant, using the LUCA API to resolve valid accounts and tax codes.
Sheet format
One worksheet. Row 1 is the header row, exactly these nine columns, in this order:
| Col | Header | Rules |
|---|---|---|
| A | Journal Date | Required. Any unambiguous date format works, e.g. 2026-05-01 or 01-May-26 — avoid all-numeric text like 01-05-26. All rows with the same date form ONE journal entry. Must fall in an open reporting period. |
| B | Account Code | Optional — fill B and/or C. Must be a code returned by GET /api/v1/accounts. Control accounts (Accounts Receivable/Payable, Current Year Earnings) are rejected by the import. |
| C | Account Name | Optional — fill B and/or C. Must be a name returned by GET /api/v1/accounts. If several accounts share a name, use the code. If both B and C are filled they must refer to the same account. Control accounts (Accounts Receivable/Payable, Current Year Earnings) are rejected by the import. |
| D | Debit | Positive number. Fill exactly one of Debit/Credit per row. Plain values, no formulas. |
| E | Credit | Positive number. Fill exactly one of Debit/Credit per row. |
| F | Tax | Optional. When used, must be EXACTLY a label from GET /api/v1/tax-codes, e.g. Sale (SR) - 9%. |
| G | Currency | Your company's default currency code on every row (e.g. SGD). |
| H | Narration | Free text per line — becomes that line item's description on the journal entry. |
| I | Description | Free text — becomes the journal entry's transaction-level description (give every row of an entry the same Description). |
Balancing rules
- Each date's lines must balance: total debit = total credit, GST-inclusive when a Tax code is used (a 100 debit with 9% tax counts as 109).
- One date = one journal entry. Two separate entries need two different dates.
- Maximum 500 rows per file.
- The journal reference number is auto-generated on import — don't include one.
Look up valid values over the API
Both endpoints are token-authenticated and scoped to the token's company (create a token in LUCA under Settings → API Tokens).
curl "https://api.luca.pro/api/v1/accounts" -H "Authorization: Bearer YOUR_TOKEN"
curl "https://api.luca.pro/api/v1/tax-codes" -H "Authorization: Bearer YOUR_TOKEN"
Requires the view accounts / view gst permissions respectively.
Ready-to-paste AI prompt
Give this to your AI assistant (with API access) together with your source
documents — GL extracts, P&L, balance sheet, bank statements. Replace the
{...} placeholders.
You are generating a journal-entry bulk-import spreadsheet for LUCA.
Inputs I will give you: general ledger extracts, P&L, balance sheet, and/or bank statements.
Produce an .xlsx file with a single worksheet where row 1 is exactly these headers, in this order:
Journal Date | Account Code | Account Name | Debit | Credit | Tax | Currency | Narration | Description
Rules:
1. One row = one ledger line. Fill exactly one of Debit or Credit per row (positive numbers, no formulas).
2. All rows with the same Journal Date form ONE journal entry, and each date's lines must
balance: total debit = total credit (GST-inclusive when a Tax code is used). If you need
two separate entries, give them different dates.
3. Write dates as YYYY-MM-DD or DD-Mmm-YY (e.g. 2026-05-01 or 01-May-26). Never use
ambiguous all-numeric formats like 01-05-26.
4. Account Code / Account Name: fill either or both — they must refer to the same account.
Only use accounts returned by the API below. If two accounts share a name, use the code.
5. Never book to control accounts: skip Accounts Receivable / Accounts Payable and Current Year Earnings even though the accounts API returns them — the import rejects those lines.
6. Tax is optional. When used, its value must be EXACTLY a `label` returned by GET /api/v1/tax-codes.
7. Currency must be {CURRENCY_CODE} on every row.
8. Narration is the per-line memo (it appears on that ledger line). Description is the
entry-level summary — give every row of the same Journal Date the same Description.
9. Maximum 500 rows per file.
Fetch valid values from the LUCA API using my token (Authorization: Bearer {API_TOKEN}):
- Accounts: GET https://api.luca.pro/api/v1/accounts (use the `code` and `name` fields)
- Tax codes: GET https://api.luca.pro/api/v1/tax-codes (use the `label` field)
Never invent account codes, names, or tax labels — only use values returned by these endpoints.
Upload the finished file in LUCA under Bulk Import → Journal Entry. Validation runs on upload; any problem rows come back with cell comments explaining the fix.