What this guide covers
This guide walks through two closely related tasks:- Manual journal entries — posting adjusting, accrual, or correcting entries with balanced lines
- Period close — locking a period after all entries are in so no accidental postings slip through
Prerequisites
- API key with scope
accounting:write(create JEs) - API key with scope
accounting:approve(approve JEs above threshold) - API key with scope
accounting:close_period(close periods) - Valid
account_idvalues for postable GL accounts (useGET /v1/gl-accounts?postable_only=true) - An open accounting period that covers your
entry_date
The two non-negotiable rules
Before writing any JE code, understand the two rules Arcus enforces at every write path:1. Debits must equal credits
Every journal entry must balance: the sum of alldebit amounts must equal the sum of all credit amounts. An off-by-one-cent imbalance is a validation failure.
code: gl_imbalance and includes the exact difference:
2. Post to leaf accounts only
You cannot post to header (rollup) accounts like “1000 Cash and Bank Accounts” or “1400 Inventory.” You must post to a leaf account like “1011 Operating Checking” or “1410 Finished Goods Inventory.” UseGET /v1/gl-accounts?postable_only=true to get the list of valid accounts for your entity.
Posting a manual journal entry
Example: prepaid insurance amortization
A 100 moves from Prepaid Expenses to Insurance Expense.Response shape
Approval workflow
If your entity has approval thresholds configured, journal entries above the low threshold land inpending_approval status. GL does not post until the entry is approved.
Check the status:
accounting:approve scope; approver must be a different user than the creator):
posted and the GL lines are active.
Reversing a posted entry
GAAP requires an audit trail: you cannot modify or delete a posted journal entry. To undo one, create a reversing entry:is_reversing: true and reversal_of_id pointing to the original.
Idempotency
Use a stableIdempotency-Key tied to your source record. For recurring entries, use a key that includes the period:
Closing an accounting period
When all entries for a period are in, close the period to prevent accidental future postings.Step 1: Run the pre-close checklist
is_closeable: true means no blocking issues. Warnings are advisory.
Common blocking issues:
| Issue | What to do |
|---|---|
| Unposted journal entries in the period | Post or delete the draft entries |
| Pending-approval journal entries | Approve or reject them |
Clearing account blocking_issue | Investigate unexplained drift in a marketplace clearing account |
Step 2: Request close (two-person flow)
For separation of duties, use the two-step close:Step 2 (alternative): Force close
Owners and admins can close immediately without a second approver:closed status. Any attempt to create a journal entry with an entry_date inside a closed period returns:
Reopening a period
If you need to post a correcting entry after close:open status. Reopen + correcting entry + re-close is the standard GAAP path for post-close adjustments. All changes are audit-logged.
Year-end closing entries
At fiscal year-end, revenue and expense account balances are swept into Retained Earnings (account 3000). As of 2026-05-13, Arcus exposesPOST /v1/accounting_periods/{id}/close-fiscal-year for automated closing-entry generation per GAAP:
closed or pending_approval status before calling this endpoint.
Balance sheet after close: GET /v1/reports/balance-sheet returns retained_earnings from the booked account 3000 balance plus current_year_earnings showing any un-closed post-close activity separately.
Manual closing entries (power-user alternative): if you need per-account line control, you can still post manual JEs through POST /v1/journal-entries:
Running reports to verify
Before closing, confirm the trial balance is in balance:Common errors
| Code | HTTP | Meaning |
|---|---|---|
gl_imbalance | 422 | Debit sum does not equal credit sum |
account_is_header | 422 | Line targets a rollup account; use a leaf account |
account_inactive | 422 | Account is deactivated; reactivate or use a different account |
account_not_found | 422 | account_id does not exist for this entity |
period_closed | 422 | entry_date falls in a closed period |
self_approval_forbidden | 422 | The approver is the same user as the creator (SoD violation) |
period_not_closeable | 422 | Checklist has blocking issues; resolve them first |
insufficient_scope | 403 | Missing accounting:write, accounting:approve, or accounting:close_period |
Next steps
- GL Fundamentals — chart of accounts structure, system account keys, and financial reports
- Purchase-to-Pay Flow — how PO receipts and vendor bills post GL entries automatically
- API Reference: Journal Entries
- API Reference: Accounting Periods
- API Reference: Financial Reports

