REST /api/v1/expense-validations 8 endpoints
GET /api/v1/expense-validations/api/v1/expense-validations

List recent validation results for an organization

Public

Response Example

{
  "data": [
    {
      "validation_id": "val_3f8c1b",
      "expense_id": "exp_9c2d7e",
      "valid": false,
      "errors": [
        "Receipt required for parking amounts over 200 NOK"
      ],
      "validated_at": "2026-03-18T09:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 1
  }
}
GET /api/v1/expense-validations/api/v1/expense-validations/:id

Get a specific validation result

Public

Response Example

{
  "validation_id": "val_3f8c1b",
  "expense_id": "exp_9c2d7e",
  "valid": false,
  "errors": [
    "Receipt required for parking amounts over 200 NOK"
  ],
  "warnings": [],
  "validated_at": "2026-03-18T09:00:00Z"
}
POST /api/v1/expense-validations/api/v1/expense-validations

Validate an expense form before submission

Public

Request Example

{
  "expense_id": "exp_9c2d7e",
  "organization_id": "org_4729bc",
  "expense_types": [
    "travel_distance",
    "parking"
  ],
  "distance_km": 42,
  "total_amount": 247.5,
  "has_receipt": false
}

Response Example

{
  "validation_id": "val_3f8c1b",
  "expense_id": "exp_9c2d7e",
  "valid": false,
  "errors": [
    "Receipt required for parking amounts over 200 NOK"
  ],
  "warnings": [],
  "field_errors": {
    "receipt": "A receipt is required when parking costs exceed the 200 NOK threshold"
  },
  "validated_at": "2026-03-18T09:00:00Z"
}
PUT /api/v1/expense-validations/api/v1/expense-validations/:id

Re-run validation after expense corrections

Public

Request Example

{
  "expense_types": [
    "travel_distance",
    "parking"
  ],
  "distance_km": 42,
  "total_amount": 247.5,
  "has_receipt": true
}

Response Example

{
  "validation_id": "val_3f8c1b",
  "valid": true,
  "errors": [],
  "warnings": [],
  "validated_at": "2026-03-18T09:12:00Z"
}
DELETE /api/v1/expense-validations/api/v1/expense-validations/:id

Clear validation result (on expense deletion)

Public

Response Example

{
  "deleted": true,
  "validation_id": "val_3f8c1b"
}
POST /api/v1/expense-validations/api/v1/expense-validations/check-expense-types

Validate selected expense types against catalogue

Public

Request Example

{
  "organization_id": "org_4729bc",
  "selected_types": [
    "travel_distance",
    "driver_honorarium",
    "coach_honorarium"
  ]
}

Response Example

{
  "valid": false,
  "errors": [
    "driver_honorarium and coach_honorarium are mutually exclusive (honorarium_group)"
  ],
  "exclusive_group_violations": [
    {
      "group": "honorarium_group",
      "conflicting_types": [
        "driver_honorarium",
        "coach_honorarium"
      ]
    }
  ]
}
POST /api/v1/expense-validations/api/v1/expense-validations/check-receipt

Check if a receipt is required for a given amount

Public

Request Example

{
  "organization_id": "org_4729bc",
  "amount": 247.5,
  "has_receipt": false
}

Response Example

{
  "receipt_required": true,
  "threshold": 200,
  "currency": "NOK",
  "valid": false,
  "message": "Receipt required for amounts over 200 NOK"
}
POST /api/v1/expense-validations/api/v1/expense-validations/check-distance

Validate reported distance

Public

Request Example

{
  "distance_km": -5
}

Response Example

{
  "valid": false,
  "errors": [
    "Distance must be a positive number"
  ],
  "distance_km": -5
}

Additional Metadata

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