Expense Validation Service
API Contract
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
}