Expense Repository
API Contract
REST
/api/v1/expenses
7 endpoints
GET
/api/v1/expenses/api/v1/expenses
List expenses with filtering
Public
Response Example
{
"data": [
{
"expense_id": "exp_9c2d7e",
"activity_id": "act_3b81fa",
"claimant_id": "usr_88f3a1",
"organization_id": "org_4729bc",
"status": "pending_attestation",
"total_amount": 247.5,
"currency": "NOK",
"submitted_at": "2026-03-18T09:14:00Z",
"created_at": "2026-03-18T08:55:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 4
}
}
GET
/api/v1/expenses/api/v1/expenses/:id
Get expense by ID
Public
Response Example
{
"expense_id": "exp_9c2d7e",
"activity_id": "act_3b81fa",
"claimant_id": "usr_88f3a1",
"organization_id": "org_4729bc",
"expense_types": [
"travel_distance",
"parking"
],
"distance_km": 42,
"total_amount": 247.5,
"currency": "NOK",
"receipt_path": "receipts/org_4729bc/exp_9c2d7e/receipt_1.jpg",
"status": "pending_attestation",
"attestation_comment": null,
"submitted_at": "2026-03-18T09:14:00Z",
"created_at": "2026-03-18T08:55:00Z",
"updated_at": "2026-03-18T09:14:00Z"
}
POST
/api/v1/expenses/api/v1/expenses
Create a new expense record
Public
Request Example
{
"activity_id": "act_3b81fa",
"claimant_id": "usr_88f3a1",
"organization_id": "org_4729bc",
"expense_types": [
"travel_distance",
"parking"
],
"distance_km": 42,
"total_amount": 247.5,
"currency": "NOK"
}
Response Example
{
"expense_id": "exp_9c2d7e",
"activity_id": "act_3b81fa",
"claimant_id": "usr_88f3a1",
"organization_id": "org_4729bc",
"expense_types": [
"travel_distance",
"parking"
],
"distance_km": 42,
"total_amount": 247.5,
"currency": "NOK",
"status": "draft",
"created_at": "2026-03-18T08:55:00Z"
}
PUT
/api/v1/expenses/api/v1/expenses/:id
Update expense (only in draft status)
Public
Request Example
{
"expense_types": [
"travel_distance",
"parking",
"toll"
],
"distance_km": 42,
"total_amount": 272,
"currency": "NOK"
}
Response Example
{
"expense_id": "exp_9c2d7e",
"expense_types": [
"travel_distance",
"parking",
"toll"
],
"distance_km": 42,
"total_amount": 272,
"currency": "NOK",
"status": "draft",
"updated_at": "2026-03-18T09:02:00Z"
}
DELETE
/api/v1/expenses/api/v1/expenses/:id
Delete draft expense
Public
Response Example
{
"deleted": true,
"expense_id": "exp_9c2d7e"
}
GET
/api/v1/expenses/api/v1/expenses/by-activity/:activityId
Get expense linked to a specific activity
Public
Response Example
{
"expense_id": "exp_9c2d7e",
"activity_id": "act_3b81fa",
"claimant_id": "usr_88f3a1",
"total_amount": 247.5,
"status": "approved"
}
GET
/api/v1/expenses/api/v1/expenses/pending-attestation
Get the pending attestation queue for an organization
Public
Response Example
{
"data": [
{
"expense_id": "exp_9c2d7e",
"claimant_name": "Kari Nordmann",
"activity_name": "Youth Football Camp",
"total_amount": 247.5,
"submitted_at": "2026-03-18T09:14:00Z"
},
{
"expense_id": "exp_1a4f8b",
"claimant_name": "Ola Hansen",
"activity_name": "Regional Swim Meet",
"total_amount": 89,
"submitted_at": "2026-03-19T11:30:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 2
}
}