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
  }
}

Additional Metadata

{
  "contract_summary": {
    "total_contracts": 410,
    "total_endpoints": 2416,
    "api_styles_used": [
      "rest"
    ]
  },
  "generated_at": "2026-03-26T06:55:53.316Z"
}