Expenses API
Endpoints for tracking and managing expenses, including receipt uploads optimized for mobile apps.
List User Expenses
Retrieves the current user's expense requests (up to 100 most recent). Results include category, payment method, and currency details.
GET /expenses
Response: 200 OK
{
"status": "SUCCESS",
"data": [
{
"id": 12,
"expense_date": "2026-04-06",
"category": 1,
"category_Name": "Travel",
"payment_method": 1,
"payment_method_Name": "Credit Card",
"currency": 1,
"currency_Name": "USD",
"payee": "Office Supplies Inc",
"amount": 125.50,
"status": "Pending"
}
]
}
Add Expense
Creates a new expense request, optionally with a receipt image.
POST /expense
Required Fields:
category: Expense category ID (from/expense/categories)payment_method: Payment method ID (from/expense/payment-methods)payee: Vendor/payee name
Request Body (with receipt):
{
"expense_date": "2026-04-06",
"category": 1,
"payment_method": 1,
"payee": "Office Supplies Inc",
"amount": 125.50,
"currency": 1,
"notes": "Office supplies for Q2",
"receipt": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD..."
}
Request Body (without receipt):
{
"expense_date": "2026-04-06",
"category": 1,
"payment_method": 1,
"payee": "Taxi Service",
"amount": 35.00,
"notes": "Client meeting transportation"
}
Response: 201 Created
Error Response: 400 Bad Request for invalid request data or image format.
Receipt Upload (Mobile-Friendly)
Mobile apps (Flutter, React Native, etc.) can upload camera-captured receipts directly in the JSON payload using base64 encoding. No separate file upload step is needed.
Receipt Field Options:
receipt: Primary receipt (base64-encoded)receipt2: Optional second receiptreceipt3: Optional third receiptreceipt_filename,receipt2_filename,receipt3_filename: Optional original filenames
Base64 Format:
- With data URI prefix:
"data:image/jpeg;base64,/9j/4AAQ..." - Raw base64:
"/9j/4AAQSkZJRg..."
Image Constraints:
- Supported formats: jpg, jpeg, png, gif, bmp, webp, heic, heif
- Maximum file size: 10MB per image
- Maximum attachments: 3 receipts per expense
List Expense Categories
Returns all available expense categories. Use the returned id when submitting an expense.
GET /expense/categories
Response: 200 OK
{
"status": "SUCCESS",
"data": [
{"id": 1, "name": "Travel", "pre_approve": "Yes"},
{"id": 2, "name": "Meals", "pre_approve": "No"}
]
}
List Payment Methods
Returns all available payment methods.
GET /expense/payment-methods
Response: 200 OK
{
"status": "SUCCESS",
"data": [
{"id": 1, "name": "Credit Card"},
{"id": 2, "name": "Cash"}
]
}
Upload Expense Attachment (Multipart)
Alternative to base64 encoding. Uploads a file using multipart/form-data and returns a saved filename to use in attachment1, attachment2, or attachment3 when creating an expense.
POST /expenses/file-upload
Request: multipart/form-data with a file field (max 10MB).
Response: 201 Created
{
"status": "SUCCESS",
"data": "17123456789012345"
}
For mobile apps, prefer the base64 receipt field on POST /expense for a simpler single-request workflow.
Expense Status Values
- Pending: Awaiting approval
- Approved: Approved for reimbursement
- Rejected: Rejected by approver
- Cancelled: Cancelled by submitter
- Processing: Reimbursement being processed
- Cancellation Requested: Cancellation requested after approval