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
| Parameter | Required | Description |
|---|---|---|
workspaceId | Yes | Filter by workspace |
projectId | No | Filter by project |
tagIds | No | Comma-separated tag IDs (OR logic) |
entryType | No | INCOME or EXPENSE |
entryStatus | No | PENDING, UNDER_REVIEW, COMPLETED, REJECTED, VOIDED |
fromDate | No | ISO date string (YYYY-MM-DD), inclusive |
toDate | No | ISO date string (YYYY-MM-DD), inclusive |
partyId | No | Filter by fromParty or toParty |
amountMin | No | Minimum amount in cents |
amountMax | No | Maximum amount in cents |
search | No | Search in description and reference (case-insensitive) |
isReconciled | No | true or false |
sortBy | No | entryDate (default), amountCents, createdAt |
sortOrder | No | ASC or DESC (default) |
limit | No | Page size (default 20, max 100) |
offset | No | Offset 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
amountCentsequals 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
PENDINGso 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
EXPENSEentries - 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 Related Entries
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.
Related Pages
- Entries — entry structure, statuses, and lifecycle
- Documents API — manage documents attached to entries
- Refunds & Reimbursements — detailed refund/reimbursement workflow