Expense Form BLoC
API Contract
REST
/api/v1/expense-form-sessions
5 endpoints
GET
/api/v1/expense-form-sessions/api/v1/expense-form-sessions
List in-progress form sessions for a user
Public
Response Example
{
"data": [
{
"session_id": "sess_b4d2f9",
"user_id": "usr_88f3a1",
"activity_id": "act_3b81fa",
"state": "awaiting_receipt",
"last_updated": "2026-03-18T09:08:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 1
}
}
GET
/api/v1/expense-form-sessions/api/v1/expense-form-sessions/:id
Get current form session state
Public
Response Example
{
"session_id": "sess_b4d2f9",
"user_id": "usr_88f3a1",
"activity_id": "act_3b81fa",
"selected_expense_types": [
"travel_distance",
"parking"
],
"amount": 247.5,
"distance_km": 42,
"has_receipt": false,
"state": "awaiting_receipt",
"validation_errors": [
"Receipt required for parking amounts over 200 NOK"
],
"last_updated": "2026-03-18T09:08:00Z"
}
POST
/api/v1/expense-form-sessions/api/v1/expense-form-sessions
Start a new expense form session
Public
Request Example
{
"user_id": "usr_88f3a1",
"activity_id": "act_3b81fa",
"organization_id": "org_4729bc"
}
Response Example
{
"session_id": "sess_b4d2f9",
"user_id": "usr_88f3a1",
"activity_id": "act_3b81fa",
"organization_id": "org_4729bc",
"state": "selecting_expense_types",
"created_at": "2026-03-18T08:55:00Z"
}
PUT
/api/v1/expense-form-sessions/api/v1/expense-form-sessions/:id
Update form state (expense type selection, amount, distance, receipt flag)
Public
Request Example
{
"event": "AmountChanged",
"selected_expense_types": [
"travel_distance",
"parking"
],
"amount": 247.5,
"distance_km": 42,
"has_receipt": false
}
Response Example
{
"session_id": "sess_b4d2f9",
"selected_expense_types": [
"travel_distance",
"parking"
],
"amount": 247.5,
"distance_km": 42,
"has_receipt": false,
"state": "awaiting_receipt",
"validation_errors": [
"Receipt required for parking amounts over 200 NOK"
],
"last_updated": "2026-03-18T09:08:00Z"
}
DELETE
/api/v1/expense-form-sessions/api/v1/expense-form-sessions/:id
Discard form session (user cancelled)
Public
Response Example
{
"deleted": true,
"session_id": "sess_b4d2f9"
}