Skip to main content

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 receipt
  • receipt3: Optional third receipt
  • receipt_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"
}
tip

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