Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.dualentry.com/llms.txt

Use this file to discover all available pages before exploring further.

Journal Entries: Reference

Journal entries are the core transaction record in DualEntry. Every financial event - whether entered manually, created by a sub-ledger, or synced from an integration - posts to the General Ledger as a journal entry with balanced debits and credits.

Header fields

Each journal entry has a header that sets the context for the transaction. The table below lists all header-level fields, their types, and whether they are required.
FieldTypeRequiredDescription
datedateYesThe accounting date the entry posts to. Must fall within an unlocked period.
transaction_datedateNoThe actual date the transaction occurred, if different from the accounting date.
company_idstringYesThe legal entity this entry belongs to.
memostringNoA description of the entry, visible in reports and search.
currencystringNoISO 4217 currency code. Defaults to the company’s base currency.
exchange_ratedecimalNoExchange rate to base currency. Required when currency differs from the company’s base currency.
reversal_datedateNoIf set, DualEntry automatically creates a reversing entry on this date. Used for accruals.
record_statusenumYesOne of draft, posted, or archived. Only posted entries affect account balances.
approval_statusenumNoTracks approval workflow state. Entries requiring approval cannot be posted until approved.
The date field determines which period an entry belongs to. If the period for that date is locked, the entry cannot be created or modified - change the date to an open period or unlock the period first.

Line fields

Each entry contains two or more lines. Total debits must equal total credits before the entry can be posted. The table below lists all line-level fields.
FieldTypeRequiredDescription
account_numberstringYesThe GL account to debit or credit. Must exist in your chart of accounts.
debitdecimalConditionalDebit amount. Provide either debit or credit per line, not both.
creditdecimalConditionalCredit amount. Provide either debit or credit per line, not both.
positionintegerNoSort order of the line within the entry. Defaults to insertion order.
memostringNoLine-level description. Useful for identifying individual line items in multi-line entries.
classificationsarrayNoDimension tags (department, location, project) applied to this line. See Classifications.
customer_idstringNoLinks this line to a specific customer for sub-ledger reporting in Accounts Receivable.
vendor_idstringNoLinks this line to a specific vendor for sub-ledger reporting in Accounts Payable.
currencystringNoLine-level currency override. When omitted, inherits the header currency.
Linking a line to a customer_id or vendor_id makes the entry appear in that customer’s or vendor’s sub-ledger, which feeds into aging reports and account reconciliation.

Create, post, and list entries

To create an entry via the API, send a POST to /public/v2/journal-entries/ with header and line data. Set record_status to draft to save without affecting balances, or posted to apply immediately. The following example creates a posted accrual entry with an automatic reversal:
{
  "date": "2026-04-30",
  "company_id": "comp_abc123",
  "memo": "April rent accrual",
  "record_status": "posted",
  "reversal_date": "2026-05-01",
  "lines": [
    { "account_number": "6200", "debit": 5000.00, "memo": "Rent expense" },
    { "account_number": "2100", "credit": 5000.00, "memo": "Accrued liabilities" }
  ]
}
When reversal_date is set, DualEntry creates a mirror entry on that date with debits and credits swapped. This is the standard pattern for month-end accruals that reverse on the first day of the next period. Retrieve journal entries with GET /public/v2/journal-entries/. The endpoint supports the following filters:
ParameterDescription
company_idFilter by legal entity.
account_idFilter to entries containing a specific account.
customer_idFilter to entries tagged with a specific customer.
vendor_idFilter to entries tagged with a specific vendor.
date_from, date_toFilter by accounting date range.
record_statusFilter by draft, posted, or archived.
approval_statusFilter by approval workflow state.
amountFilter by line amount (exact match or range).
Combine filters to narrow results - for example, all posted entries for a single vendor within a date range. Pagination defaults to 100 entries per page; use page and page_size parameters to navigate larger result sets.

Classifications

Classifications are multi-dimensional tags you apply to journal entry lines for segmented reporting. Common classifications include Department, Location, Project, and Class. Manage classifications through Settings → Classifications or via GET /public/v2/classifications/. When you assign a classification to a line, the balance for that line rolls up into dimension-specific reports. This enables analysis like revenue by department or expenses by project without maintaining separate accounts. You can require classifications on specific accounts by enabling the Require classification setting on the account - DualEntry blocks posting if a required classification is missing. Classifications are also available as filters in the flux analysis and financial statements modules, so the tags you apply at the line level carry through to period-end reporting. You can manage classification values (add, rename, deactivate) through Settings → Classifications or the API at any time without affecting historical entries. Deactivated values remain on existing entries but are hidden from selection dropdowns for new entries.

Recurring and intercompany entries

For entries that repeat on a schedule - monthly rent, depreciation, insurance amortization - use recurring journal entries. Create a template via POST /public/v2/recurring/journal-entries/ with the same header and line structure, plus a recurrence schedule (frequency, start date, end date). DualEntry generates a draft journal entry from each template on the scheduled date. Review and post the drafts, or configure auto-posting if the amounts are fixed and don’t require review. Intercompany journal entries record transactions that span two or more legal entities. Use POST /public/v2/intercompany-journal-entries/ to create them. Lines on an intercompany entry reference accounts across different companies, and the entry must balance in aggregate - total debits across all entities equal total credits. DualEntry automatically creates the corresponding intercompany receivable and payable on each entity’s books so that individual company trial balances remain in balance. Intercompany eliminations are handled during consolidation.
Recurring entries generate drafts by default. Enable auto-posting only for entries with fixed amounts that don’t need period-over-period review - depreciation on a straight-line asset, for example.

Attachments and locked-period behavior

You can attach supporting documents - scanned invoices, contracts, approvals - to any journal entry. Attachments are stored at the header level and accessible from the entry detail view. Use attachments to maintain the audit trail without relying on external file storage. Supported file types include PDF, PNG, JPEG, and CSV. Each entry supports up to 25 attachments with a maximum file size of 10 MB per attachment. Entries posted to a locked period cannot be edited or voided. If you need to correct an entry in a locked period, unlock the period (requires admin or controller permission) or post an adjusting entry in the current open period. The lock applies to the date field - changing the date on a draft entry to an open period lets you post it even when the original date’s period is locked.
Entries posted to a locked period cannot be edited or voided. If you need to correct an entry in a locked period, unlock the period (requires admin or controller permission) or post an adjusting entry in the current open period.
For step-by-step account setup, see Chart of Accounts. To protect closed periods from unintended changes, see Period Locking. For anomaly detection on posted entries, see Anomaly Detection.
Last modified on May 28, 2026