Skip to main content

Entries API

List Entries

GET /entries?workspaceId={id}&projectId={id}&tagIds={id1,id2}&entryType=INCOME&entryStatus=COMPLETED&fromDate=2025-01-01&toDate=2025-12-31&partyId=5&search=invoice&isReconciled=true&sortBy=entryDate&sortOrder=DESC&limit=20&offset=0
ParameterRequiredDescription
workspaceIdYesFilter by workspace
projectIdNoFilter by project
tagIdsNoComma-separated tag IDs (OR logic)
entryTypeNoINCOME or EXPENSE
entryStatusNoPENDING, UNDER_REVIEW, COMPLETED, REJECTED, VOIDED
fromDateNoISO date string (YYYY-MM-DD), inclusive
toDateNoISO date string (YYYY-MM-DD), inclusive
partyIdNoFilter by fromParty or toParty
amountMinNoMinimum amount in cents
amountMaxNoMaximum amount in cents
searchNoSearch in description and reference (case-insensitive)
isReconciledNotrue or false
sortByNoentryDate (default), amountCents, createdAt
sortOrderNoASC or DESC (default)
limitNoPage size (default 20, max 100)
offsetNoOffset for pagination

Export Entries (CSV)

GET /entries/export/csv?workspaceId={id}&...

Accepts the same filter parameters as List Entries. Returns a CSV file with headers: ID, Date, Type, Status, Amount, Currency, Description, Reference, From Party, To Party, Reconciled, Tags

Permission required: entry.export

Get Entry

GET /entries/{id}

Returns the entry with all related data: items, transactions, documents, tags, parties.

Create Entry

POST /entries
{
"projectId": 1,
"entrySourceId": 1,
"entryType": "EXPENSE",
"baseCurrency": "USD",
"amountCents": 50000,
"fromPartyId": 1,
"toPartyId": 2,
"entryDate": "2025-06-15",
"description": "Office supplies",
"reference": "INV-001"
}

Permission required: entry.create

Update Entry Fields

PATCH /entries/{id}
{
"description": "Updated description",
"reference": "INV-002",
"entryDate": "2025-07-01",
"amountCents": 60000
}

All fields are optional. Cannot edit voided entries. Permission required: entry.edit

Toggle Reconciliation

PATCH /entries/{id}/reconcile
{
"isReconciled": true
}

Marks or unmarks an entry as reconciled. Records reconciledAt and reconciledBy. Permission required: entry.reconcile

Entry Notes

GET /entries/{id}/notes
POST /entries/{id}/notes

POST body:

{
"content": "Verified against bank statement 2025-06-15"
}

Returns notes with author information, ordered by most recent first.

Permission required for POST: entry.note

Update Status

PATCH /entries/{id}/status
{
"status": "COMPLETED",
"reason": "All documents verified"
}

Permission required: entry.edit

Status transitions are validated server-side. Not every status can move to every other status, and destructive transitions like REJECTED, CANCELLED, or VOIDED require a reason.

Void Entry

POST /entries/{id}/void
{
"reason": "Duplicate entry"
}

Marks the entry as VOIDED. Entries in closed accounting periods cannot be voided. Permission required: entry.void

Create Refund

POST /entries/{id}/refund
{
"amountCents": 50000,
"description": "Full refund"
}

Creates a new linked entry with reversed parties and opposite type.

  • Full refund: if amountCents equals the original amount, the original entry is voided
  • Partial refund: the original entry remains active and only the linked refund entry is created
  • The refund entry is created in PENDING so it can go through the normal review/sync workflow
  • Refund amount must be greater than zero and cannot exceed the original entry amount
  • Refund creation is blocked if the refund date falls in a closed accounting period

Permission required: entry.void

Create Reimbursement

POST /entries/{id}/reimburse
{
"amountCents": 15000,
"fromPartyId": 1,
"toPartyId": 3,
"description": "Taxi reimbursement"
}

Creates a new linked entry for employee reimbursement.

  • Reimbursements can only be created from EXPENSE entries
  • Reimbursement amount must be greater than zero and cannot exceed the original expense amount
  • The reimbursement entry is created in PENDING
  • Reimbursement creation is blocked if the reimbursement date falls in a closed accounting period

Permission required: entry.create

Get Events (Audit Trail)

GET /entries/{id}/events

Returns the full event history for an entry.

The event stream now includes note creation events (NOTE_ADDED) so the UI can assemble a full activity timeline without relying only on document and status changes.

GET /entries/{id}/related

Returns entries linked to this entry (refunds, reimbursements, corrections).

Access Scope

Entry detail, notes, events, related entries, and CSV export are all scoped to entries or workspaces the authenticated user can actually access. Passing another workspace or entry ID is not sufficient without membership-based access.