Expenses
Direct cash / bank payments that don't go through a vendor bill — petty cash, reimbursements, recurring direct debits. The journal posts Dr Expense + GST inputs / Cr Paid-Through in one call.
GET
/expensesList expensesAIBooks.expenses.READGET
/expenses/{expense_id}Get one expenseAIBooks.expenses.READPOST
/expensesCreate + post journalAIBooks.expenses.CREATEPUT
/expenses/{expense_id}UpdateAIBooks.expenses.UPDATEDELETE
/expenses/{expense_id}Delete + reverse journalAIBooks.expenses.DELETEBody — single account
POST /expenses
{
"date": "2026-05-12T00:00:00",
"account_id": "acc_office_rent",
"paid_through_account_id": "acc_icici",
"amount": 5000.0,
"mode": "BANK",
"reference_number": "RENT-MAY",
"vendor_id": "ct_landlord", // optional
"tax_id": "tx_gst_18", // optional
"is_inclusive_tax": false,
"notes": null
}Body — itemised (per-line accounts)
Pass line_items[]to split the expense across multiple accounts. Each line's account_id + tax_id override the header values, and the journal debits each line's account at its taxable value.
POST /expenses
{
"date": "2026-05-12T00:00:00",
"account_id": "acc_office_rent", // header default; can be overridden per line
"paid_through_account_id": "acc_icici",
"amount": 0, // ignored when line_items[] is set
"line_items": [
{ "account_id": "acc_office_rent", "amount": 4000, "tax_id": "tx_gst_18", "note": "Rent" },
{ "account_id": "acc_internet", "amount": 1000, "tax_id": "tx_gst_18", "note": "ISP" }
]
}RCM (Reverse Charge Mechanism)
For §9(3)/(4) supplies where the recipient self-assesses GST, set is_rcm: true + a rcm_rate. The vendor's bill carries no GST; the rate you provide drives the Dr Input + Cr Output GST self-assessment journal.
ITC-blocked expenses
Set itc_blocked_reason: “17(5)(a)” (or another §17(5) clause) to capitalise the GST into the expense ledger instead of claiming it as input credit.