Expenses
Record business expenses with automatic journal entry creation. Expenses can be linked to vendors, projects, and customers (for billable expenses). Each expense posts to the specified expense account and deducts from the paid-through account.
Endpoints
GET
/api/v1/expensesGET
/api/v1/expenses/{id}POST
/api/v1/expensesPUT
/api/v1/expenses/{id}DELETE
/api/v1/expenses/{id}List expenses
GET
/api/v1/expensesQuery parameters
| Parameter | Type | Description |
|---|---|---|
from | date | Expense date from (YYYY-MM-DD). |
to | date | Expense date to. |
category | string | Filter by expense category. |
contactId | UUID | Filter by vendor contact. |
page, size, sort | int / string | Pagination (0-indexed, default size: 20). |
Roles: OWNER, ADMIN, ACCOUNTANT, OPERATOR, VIEWER.
Create an expense
POST
/api/v1/expensesRecords a new expense and creates the corresponding journal entry. Returns 201 Created.
curl -X POST https://api.katixo.com/api/v1/expenses \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"expenseDate": "2026-06-10",
"accountId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"category": "Office Supplies",
"description": "Printer cartridges and A4 paper",
"amount": 2500.00,
"gstRate": 18.00,
"paymentMode": "UPI",
"paidThroughId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"billable": false
}'Request body
| Field | Type | Required | Description |
|---|---|---|---|
expenseDate | date | Yes | Date of the expense. |
accountId | UUID | Yes | Expense account to debit. |
amount | decimal | Yes | Expense amount (must be > 0.01). |
paymentMode | string | Yes | How the expense was paid (e.g., UPI, Cash, Bank Transfer). |
paidThroughId | UUID | Yes | Account the payment was made from (e.g., cash, bank account). |
gstRate | decimal | No | GST rate (0, 5, 12, 18, or 28). Defaults to 0. |
category | string | No | Expense category for reporting. |
contactId | UUID | No | Vendor contact. Optional for cash expenses. |
billable | boolean | No | Whether this expense can be billed to a customer. |
customerContactId | UUID | No | Customer to bill this expense to (when billable). |
receiptUrl | string | No | URL to the uploaded receipt image. |
Void an expense
DELETE
/api/v1/expenses/{id}The DELETE endpoint voids the expense rather than deleting it — it creates a reversal journal entry and marks the expense as VOIDED. The record remains for audit purposes. Optionally pass a reason in the request body. Requires OWNER, ADMIN, or ACCOUNTANT role.
The Expense object
{
"id": "d4e5f6a7-b8c9-0123-4567-89abcdef0123",
"expenseNumber": "EXP-2026-0034",
"expenseDate": "2026-06-10",
"accountId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"accountCode": "5001",
"accountName": "Office Supplies",
"category": "Office Supplies",
"description": "Printer cartridges and A4 paper",
"amount": 2500.00,
"taxAmount": 450.00,
"total": 2950.00,
"currency": "INR",
"gstRate": 18.00,
"contactId": null,
"contactName": null,
"paymentMode": "UPI",
"paidThroughId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"paidThroughName": "HDFC Current Account",
"billable": false,
"projectId": null,
"customerContactId": null,
"customerContactName": null,
"receiptUrl": null,
"status": "ACTIVE",
"journalEntryId": "e5f6a7b8-c9d0-1234-5678-9abcdef01234",
"createdAt": "2026-06-10T11:30:00Z"
}