💸 Expenses
Expense recording and management
List all expenses for an organization
Filter by account unique_id
Filter by employee unique_id
Filter expenses from this expense_date (YYYY-MM-DD)
Search expense_number or title
Filter by expense status
Filter expenses up to this expense_date (YYYY-MM-DD)
Filter by vendor unique_id
Lightweight version for list views.
draft- Draftsubmitted- Submitted for Approvalapproved- Approvedpaid- Paidrejected- Rejectedreimbursed- Reimbursed
^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,10}(?:\.\d{0,2})?$Unauthorized
Forbidden
GET /api/v1.0/organisation/{org_id}/expenses/ HTTP/1.1
Host: skhokho.ai
Authorization: Basic username:password
Accept: */*
[
{
"unique_id": "text",
"title": "text",
"expense_number": "text",
"status": "draft",
"status_display": "text",
"expense_date": "2026-01-01",
"amount": "text",
"tax_amount": "text",
"total_amount": "text",
"employee": {
"unique_id": "text",
"full_name": "text"
},
"vendor": {
"unique_id": "text",
"name": "text"
},
"date_created": "2026-01-01T00:00:00.000Z"
}
]Create a new expense
Comprehensive serializer for Expense model.
draft- Draftsubmitted- Submitted for Approvalapproved- Approvedpaid- Paidrejected- Rejectedreimbursed- Reimbursed
^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,13}(?:\.\d{0,2})?$Receipt or supporting document
Whether VAT has been processed for reconciliation
Comprehensive serializer for Expense model.
draft- Draftsubmitted- Submitted for Approvalapproved- Approvedpaid- Paidrejected- Rejectedreimbursed- Reimbursed
^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,10}(?:\.\d{0,2})?$Receipt or supporting document
Whether VAT has been processed for reconciliation
Bad Request
Unauthorized
Forbidden
POST /api/v1.0/organisation/{org_id}/expenses/create/ HTTP/1.1
Host: skhokho.ai
Authorization: Basic username:password
Content-Type: application/json
Accept: */*
Content-Length: 276
{
"unique_id": "text",
"title": "text",
"description": "text",
"notes": "text",
"expense_number": "text",
"account_id": "text",
"status": "draft",
"expense_date": "2026-01-01",
"amount": "text",
"tax_amount": "text",
"vendor_id": "text",
"employee_id": "text",
"receipt": "binary",
"vat_processed": true
}{
"unique_id": "text",
"title": "text",
"description": "text",
"notes": "text",
"expense_number": "text",
"account": {
"unique_id": "text",
"account_code": "text",
"name": "text",
"account_type": "asset"
},
"status": "draft",
"status_display": "text",
"expense_date": "2026-01-01",
"submitted_date": "2026-01-01T00:00:00.000Z",
"approved_date": "2026-01-01T00:00:00.000Z",
"paid_date": "2026-01-01T00:00:00.000Z",
"amount": "text",
"tax_amount": "text",
"total_amount": "text",
"vendor": {
"unique_id": "text",
"name": "text"
},
"employee": {
"unique_id": "text",
"full_name": "text"
},
"approved_by": {
"unique_id": "text",
"full_name": "text"
},
"receipt": "https://example.com",
"receipt_url": "text",
"vat_processed": true,
"vat_processed_date": "2026-01-01T00:00:00.000Z",
"created_by": {
"unique_id": "text",
"full_name": "text"
},
"date_created": "2026-01-01T00:00:00.000Z",
"last_updated": "2026-01-01T00:00:00.000Z"
}Retrieve a specific expense with full details
Comprehensive serializer for Expense model.
draft- Draftsubmitted- Submitted for Approvalapproved- Approvedpaid- Paidrejected- Rejectedreimbursed- Reimbursed
^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,10}(?:\.\d{0,2})?$Receipt or supporting document
Whether VAT has been processed for reconciliation
Unauthorized
Forbidden
Not Found
GET /api/v1.0/organisation/{org_id}/expenses/{expense_id}/ HTTP/1.1
Host: skhokho.ai
Authorization: Basic username:password
Accept: */*
{
"unique_id": "text",
"title": "text",
"description": "text",
"notes": "text",
"expense_number": "text",
"account": {
"unique_id": "text",
"account_code": "text",
"name": "text",
"account_type": "asset"
},
"status": "draft",
"status_display": "text",
"expense_date": "2026-01-01",
"submitted_date": "2026-01-01T00:00:00.000Z",
"approved_date": "2026-01-01T00:00:00.000Z",
"paid_date": "2026-01-01T00:00:00.000Z",
"amount": "text",
"tax_amount": "text",
"total_amount": "text",
"vendor": {
"unique_id": "text",
"name": "text"
},
"employee": {
"unique_id": "text",
"full_name": "text"
},
"approved_by": {
"unique_id": "text",
"full_name": "text"
},
"receipt": "https://example.com",
"receipt_url": "text",
"vat_processed": true,
"vat_processed_date": "2026-01-01T00:00:00.000Z",
"created_by": {
"unique_id": "text",
"full_name": "text"
},
"date_created": "2026-01-01T00:00:00.000Z",
"last_updated": "2026-01-01T00:00:00.000Z"
}Update an existing expense
Comprehensive serializer for Expense model.
draft- Draftsubmitted- Submitted for Approvalapproved- Approvedpaid- Paidrejected- Rejectedreimbursed- Reimbursed
^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,13}(?:\.\d{0,2})?$Receipt or supporting document
Whether VAT has been processed for reconciliation
Comprehensive serializer for Expense model.
draft- Draftsubmitted- Submitted for Approvalapproved- Approvedpaid- Paidrejected- Rejectedreimbursed- Reimbursed
^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,10}(?:\.\d{0,2})?$Receipt or supporting document
Whether VAT has been processed for reconciliation
Bad Request
Unauthorized
Forbidden
Not Found
PUT /api/v1.0/organisation/{org_id}/expenses/{expense_id}/update/ HTTP/1.1
Host: skhokho.ai
Authorization: Basic username:password
Content-Type: application/json
Accept: */*
Content-Length: 276
{
"unique_id": "text",
"title": "text",
"description": "text",
"notes": "text",
"expense_number": "text",
"account_id": "text",
"status": "draft",
"expense_date": "2026-01-01",
"amount": "text",
"tax_amount": "text",
"vendor_id": "text",
"employee_id": "text",
"receipt": "binary",
"vat_processed": true
}{
"unique_id": "text",
"title": "text",
"description": "text",
"notes": "text",
"expense_number": "text",
"account": {
"unique_id": "text",
"account_code": "text",
"name": "text",
"account_type": "asset"
},
"status": "draft",
"status_display": "text",
"expense_date": "2026-01-01",
"submitted_date": "2026-01-01T00:00:00.000Z",
"approved_date": "2026-01-01T00:00:00.000Z",
"paid_date": "2026-01-01T00:00:00.000Z",
"amount": "text",
"tax_amount": "text",
"total_amount": "text",
"vendor": {
"unique_id": "text",
"name": "text"
},
"employee": {
"unique_id": "text",
"full_name": "text"
},
"approved_by": {
"unique_id": "text",
"full_name": "text"
},
"receipt": "https://example.com",
"receipt_url": "text",
"vat_processed": true,
"vat_processed_date": "2026-01-01T00:00:00.000Z",
"created_by": {
"unique_id": "text",
"full_name": "text"
},
"date_created": "2026-01-01T00:00:00.000Z",
"last_updated": "2026-01-01T00:00:00.000Z"
}Update an existing expense
Comprehensive serializer for Expense model.
draft- Draftsubmitted- Submitted for Approvalapproved- Approvedpaid- Paidrejected- Rejectedreimbursed- Reimbursed
^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,13}(?:\.\d{0,2})?$Receipt or supporting document
Whether VAT has been processed for reconciliation
Comprehensive serializer for Expense model.
draft- Draftsubmitted- Submitted for Approvalapproved- Approvedpaid- Paidrejected- Rejectedreimbursed- Reimbursed
^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,10}(?:\.\d{0,2})?$Receipt or supporting document
Whether VAT has been processed for reconciliation
Bad Request
Unauthorized
Forbidden
Not Found
PATCH /api/v1.0/organisation/{org_id}/expenses/{expense_id}/update/ HTTP/1.1
Host: skhokho.ai
Authorization: Basic username:password
Content-Type: application/json
Accept: */*
Content-Length: 276
{
"unique_id": "text",
"title": "text",
"description": "text",
"notes": "text",
"expense_number": "text",
"account_id": "text",
"status": "draft",
"expense_date": "2026-01-01",
"amount": "text",
"tax_amount": "text",
"vendor_id": "text",
"employee_id": "text",
"receipt": "binary",
"vat_processed": true
}{
"unique_id": "text",
"title": "text",
"description": "text",
"notes": "text",
"expense_number": "text",
"account": {
"unique_id": "text",
"account_code": "text",
"name": "text",
"account_type": "asset"
},
"status": "draft",
"status_display": "text",
"expense_date": "2026-01-01",
"submitted_date": "2026-01-01T00:00:00.000Z",
"approved_date": "2026-01-01T00:00:00.000Z",
"paid_date": "2026-01-01T00:00:00.000Z",
"amount": "text",
"tax_amount": "text",
"total_amount": "text",
"vendor": {
"unique_id": "text",
"name": "text"
},
"employee": {
"unique_id": "text",
"full_name": "text"
},
"approved_by": {
"unique_id": "text",
"full_name": "text"
},
"receipt": "https://example.com",
"receipt_url": "text",
"vat_processed": true,
"vat_processed_date": "2026-01-01T00:00:00.000Z",
"created_by": {
"unique_id": "text",
"full_name": "text"
},
"date_created": "2026-01-01T00:00:00.000Z",
"last_updated": "2026-01-01T00:00:00.000Z"
}Perform an action on an expense using query parameter.
**Available Actions:**
- `submit` - Submit a draft expense for approval
- `approve` - Approve a submitted expense
- `reject` - Reject a submitted expense (supports optional `reason` parameter)
- `mark_paid` - Mark an approved expense as paid
**Examples:**
- `/expenses/{id}/action?action=submit`
- `/expenses/{id}/action?action=approve`
- `/expenses/{id}/action?action=reject&reason=Missing+receipts`
- `/expenses/{id}/action?action=mark_paid`The action to perform on the expense
Reason for rejection (only used with action=reject)
Comprehensive serializer for Expense model.
draft- Draftsubmitted- Submitted for Approvalapproved- Approvedpaid- Paidrejected- Rejectedreimbursed- Reimbursed
^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,13}(?:\.\d{0,2})?$^-?\d{0,10}(?:\.\d{0,2})?$Receipt or supporting document
Whether VAT has been processed for reconciliation
Bad Request - Invalid action or invalid state transition
Unauthorized
Forbidden
Not Found
GET /api/v1.0/organisation/{org_id}/expenses/{expense_id}/action/?action=approve HTTP/1.1
Host: skhokho.ai
Authorization: Basic username:password
Accept: */*
{
"unique_id": "text",
"title": "text",
"description": "text",
"notes": "text",
"expense_number": "text",
"account": {
"unique_id": "text",
"account_code": "text",
"name": "text",
"account_type": "asset"
},
"status": "draft",
"status_display": "text",
"expense_date": "2026-01-01",
"submitted_date": "2026-01-01T00:00:00.000Z",
"approved_date": "2026-01-01T00:00:00.000Z",
"paid_date": "2026-01-01T00:00:00.000Z",
"amount": "text",
"tax_amount": "text",
"total_amount": "text",
"vendor": {
"unique_id": "text",
"name": "text"
},
"employee": {
"unique_id": "text",
"full_name": "text"
},
"approved_by": {
"unique_id": "text",
"full_name": "text"
},
"receipt": "https://example.com",
"receipt_url": "text",
"vat_processed": true,
"vat_processed_date": "2026-01-01T00:00:00.000Z",
"created_by": {
"unique_id": "text",
"full_name": "text"
},
"date_created": "2026-01-01T00:00:00.000Z",
"last_updated": "2026-01-01T00:00:00.000Z"
}Last updated
