M1: contracts and vectors (SPEC v0.1, schema 1)

contracts/openapi.yaml (OpenAPI 3.1, E-1..E-33, error shape and the
exhaustive error code enum, device bearer scheme), contracts/schema/
server-v1.sql (SPEC §14.1 verbatim), seven test-vector files per §14.5.5,
80 examples (every JSON body of §14.3.4, every error code, sync pull/push,
every FCM push type), and tools/contracts-check.py (stdlib-only reference
of §9.1, §9.3, §9.4 and §14.5.4 plus shape checks; the M1 gate).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-17 20:57:59 +02:00
parent cab3e935d6
commit c6df2ab8f5
90 changed files with 8931 additions and 0 deletions
@@ -0,0 +1,6 @@
{
"status": "ok",
"server_version": "0.1.0",
"schema_version": 1,
"db_ok": true
}
@@ -0,0 +1,9 @@
{
"id": "0192a000-0000-7000-8000-000000000001",
"role": "admin",
"display_name": "Jacob",
"picture_version": null,
"created_at": "2026-10-17T06:12:40.512Z",
"updated_at": "2026-10-17T09:12:00.000Z",
"server_version": 42
}
@@ -0,0 +1,4 @@
{
"kind": "partner",
"target_user_id": null
}
@@ -0,0 +1,9 @@
{
"id": "0192a002-0000-7000-8000-000000000001",
"kind": "partner",
"target_user_id": null,
"code": "4N8RVT2KW6ZC",
"link": "https://icehack.asuscomm.com:8443/i/4N8RVT2KW6ZC",
"created_at": "2026-10-17T06:30:02.004Z",
"expires_at": "2026-10-20T06:30:02.004Z"
}
@@ -0,0 +1,13 @@
{
"invites": [
{
"id": "0192a002-0000-7000-8000-000000000002",
"kind": "device",
"target_user_id": "0192a000-0000-7000-8000-000000000002",
"code": null,
"link": null,
"created_at": "2026-10-17T09:00:00.000Z",
"expires_at": "2026-10-20T09:00:00.000Z"
}
]
}
@@ -0,0 +1,34 @@
{
"devices": [
{
"id": "0192a001-0000-7000-8000-000000000001",
"user_id": "0192a000-0000-7000-8000-000000000001",
"name": "Galaxy S26",
"app_version_code": 41,
"created_at": "2026-10-17T06:12:40.512Z",
"last_seen_at": "2026-10-17T09:00:00.000Z",
"revoked_at": null,
"is_current": true
},
{
"id": "0192a001-0000-7000-8000-000000000003",
"user_id": "0192a000-0000-7000-8000-000000000001",
"name": "Old phone",
"app_version_code": null,
"created_at": "2026-10-17T06:20:00.000Z",
"last_seen_at": "2026-10-17T06:25:00.000Z",
"revoked_at": "2026-10-17T06:40:00.000Z",
"is_current": false
},
{
"id": "0192a001-0000-7000-8000-000000000002",
"user_id": "0192a000-0000-7000-8000-000000000002",
"name": "Galaxy S26+",
"app_version_code": 41,
"created_at": "2026-10-17T07:01:15.000Z",
"last_seen_at": "2026-10-17T08:40:12.000Z",
"revoked_at": null,
"is_current": false
}
]
}
@@ -0,0 +1,3 @@
{
"fcm_token": "fGx1c2hUb2tlbjpBUEE5MWJIUG5vQ2tFeGFtcGxl"
}
@@ -0,0 +1,13 @@
{
"name": "Vardag",
"default_shares": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 5000
}
]
}
@@ -0,0 +1,20 @@
{
"id": "0192a003-0000-7000-8000-000000000001",
"name": "Vardag",
"default_shares": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 5000
}
],
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T07:10:00.000Z",
"updated_at": "2026-10-17T07:10:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 13
}
@@ -0,0 +1,13 @@
{
"name": "Vardag & mat",
"default_shares": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 6000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 4000
}
]
}
@@ -0,0 +1,20 @@
{
"id": "0192a003-0000-7000-8000-000000000001",
"name": "Vardag & mat",
"default_shares": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 6000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 4000
}
],
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T07:10:00.000Z",
"updated_at": "2026-10-17T09:13:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 43
}
@@ -0,0 +1,3 @@
{
"initialized": true
}
@@ -0,0 +1,20 @@
{
"id": "0192a003-0000-7000-8000-000000000002",
"name": "Resor",
"default_shares": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 5000
}
],
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T07:10:00.000Z",
"updated_at": "2026-10-17T09:14:00.000Z",
"archived_at": "2026-10-17T09:14:00.000Z",
"deleted_at": null,
"server_version": 44
}
@@ -0,0 +1,20 @@
{
"id": "0192a003-0000-7000-8000-000000000002",
"name": "Resor",
"default_shares": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 5000
}
],
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T07:10:00.000Z",
"updated_at": "2026-10-17T09:15:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 45
}
@@ -0,0 +1,20 @@
{
"id": "0192a003-0000-7000-8000-000000000002",
"name": "Resor",
"default_shares": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 5000
}
],
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T07:10:00.000Z",
"updated_at": "2026-10-17T09:16:00.000Z",
"archived_at": null,
"deleted_at": "2026-10-17T09:16:00.000Z",
"server_version": 46
}
@@ -0,0 +1,5 @@
{
"name": "Husdjur",
"icon": "pets",
"color": "lime"
}
@@ -0,0 +1,13 @@
{
"id": "0192a007-0000-7000-8000-000000000001",
"default_key": null,
"name": "Husdjur",
"icon": "pets",
"color": "lime",
"sort_order": 110,
"created_at": "2026-10-17T09:17:00.000Z",
"updated_at": "2026-10-17T09:17:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 47
}
@@ -0,0 +1,4 @@
{
"name": "Matvaror",
"sort_order": 15
}
@@ -0,0 +1,13 @@
{
"id": "01920000-0000-7000-8000-000000000001",
"default_key": "groceries",
"name": "Matvaror",
"icon": "shopping_cart",
"color": "green",
"sort_order": 15,
"created_at": "2026-10-17T00:00:00.000Z",
"updated_at": "2026-10-17T09:18:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 48
}
@@ -0,0 +1,13 @@
{
"id": "0192a007-0000-7000-8000-000000000001",
"default_key": null,
"name": "Husdjur",
"icon": "pets",
"color": "lime",
"sort_order": 110,
"created_at": "2026-10-17T09:17:00.000Z",
"updated_at": "2026-10-17T09:19:00.000Z",
"archived_at": "2026-10-17T09:19:00.000Z",
"deleted_at": null,
"server_version": 49
}
@@ -0,0 +1,13 @@
{
"id": "0192a007-0000-7000-8000-000000000001",
"default_key": null,
"name": "Husdjur",
"icon": "pets",
"color": "lime",
"sort_order": 110,
"created_at": "2026-10-17T09:17:00.000Z",
"updated_at": "2026-10-17T09:20:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 50
}
@@ -0,0 +1,13 @@
{
"id": "0192a007-0000-7000-8000-000000000001",
"default_key": null,
"name": "Husdjur",
"icon": "pets",
"color": "lime",
"sort_order": 110,
"created_at": "2026-10-17T09:17:00.000Z",
"updated_at": "2026-10-17T09:21:00.000Z",
"archived_at": null,
"deleted_at": "2026-10-17T09:21:00.000Z",
"server_version": 51
}
@@ -0,0 +1,25 @@
{
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000003",
"amount_ore": 1250000,
"description": "Hyra",
"notes": "",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "ratio",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 6000,
"share_ore": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 4000,
"share_ore": null
}
],
"day_of_month": 25,
"start_period": "2026-10",
"end_period": null,
"paused": false
}
@@ -0,0 +1,34 @@
{
"id": "0192a004-0000-7000-8000-000000000001",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000003",
"amount_ore": 1250000,
"description": "Hyra",
"notes": "",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "ratio",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 6000,
"share_ore": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 4000,
"share_ore": null
}
],
"day_of_month": 25,
"start_period": "2026-10",
"end_period": null,
"paused": false,
"last_generated_period": null,
"next_occurrence_date": "2026-10-25",
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T06:30:02.004Z",
"updated_at": "2026-10-17T06:30:02.004Z",
"deleted_at": null,
"server_version": 30
}
@@ -0,0 +1,3 @@
{
"paused": true
}
@@ -0,0 +1,34 @@
{
"id": "0192a004-0000-7000-8000-000000000001",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000003",
"amount_ore": 1250000,
"description": "Hyra",
"notes": "",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "ratio",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 6000,
"share_ore": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 4000,
"share_ore": null
}
],
"day_of_month": 25,
"start_period": "2026-10",
"end_period": null,
"paused": true,
"last_generated_period": null,
"next_occurrence_date": null,
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T06:30:02.004Z",
"updated_at": "2026-10-17T09:22:00.000Z",
"deleted_at": null,
"server_version": 52
}
@@ -0,0 +1,5 @@
{
"code": "7K3MQX9D2HPA",
"device_name": "Galaxy S26",
"display_name": "Jacob"
}
@@ -0,0 +1,33 @@
{
"token": "kvt_q7Zm0yHc1u2R9vXgB4kLw8sTn3eP6aJdF5oQ1iYbV0c",
"user": {
"id": "0192a000-0000-7000-8000-000000000001",
"role": "admin",
"display_name": "Jacob",
"picture_version": null,
"created_at": "2026-10-17T06:12:40.512Z",
"updated_at": "2026-10-17T06:12:40.512Z",
"server_version": 11
},
"device": {
"id": "0192a001-0000-7000-8000-000000000001",
"user_id": "0192a000-0000-7000-8000-000000000001",
"name": "Galaxy S26",
"app_version_code": 41,
"created_at": "2026-10-17T06:12:40.512Z",
"last_seen_at": "2026-10-17T09:00:00.000Z",
"revoked_at": null,
"is_current": true
},
"household": [
{
"id": "0192a000-0000-7000-8000-000000000001",
"role": "admin",
"display_name": "Jacob",
"picture_version": null,
"created_at": "2026-10-17T06:12:40.512Z",
"updated_at": "2026-10-17T06:12:40.512Z",
"server_version": 11
}
]
}
@@ -0,0 +1,34 @@
{
"id": "0192a004-0000-7000-8000-000000000001",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000003",
"amount_ore": 1250000,
"description": "Hyra",
"notes": "",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "ratio",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 6000,
"share_ore": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 4000,
"share_ore": null
}
],
"day_of_month": 25,
"start_period": "2026-10",
"end_period": null,
"paused": false,
"last_generated_period": null,
"next_occurrence_date": null,
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T06:30:02.004Z",
"updated_at": "2026-10-17T09:23:00.000Z",
"deleted_at": "2026-10-17T09:23:00.000Z",
"server_version": 53
}
@@ -0,0 +1,323 @@
{
"epoch": "30b85fb529aac0016dc91650841005b9",
"since": 0,
"next_since": 921,
"has_more": true,
"server_time": "2026-10-25T12:00:00.000Z",
"users": [
{
"id": "0192a000-0000-7000-8000-000000000001",
"role": "admin",
"display_name": "Jacob",
"picture_version": null,
"created_at": "2026-10-17T06:12:40.512Z",
"updated_at": "2026-10-17T06:12:40.512Z",
"server_version": 11
},
{
"id": "0192a000-0000-7000-8000-000000000002",
"role": "member",
"display_name": "Anna",
"picture_version": 2,
"created_at": "2026-10-17T07:01:15.000Z",
"updated_at": "2026-10-17T07:05:00.250Z",
"server_version": 12
}
],
"categories": [
{
"id": "01920000-0000-7000-8000-000000000001",
"default_key": "groceries",
"name": null,
"icon": "shopping_cart",
"color": "green",
"sort_order": 10,
"created_at": "2026-10-17T00:00:00.000Z",
"updated_at": "2026-10-17T00:00:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 1
},
{
"id": "01920000-0000-7000-8000-000000000002",
"default_key": "restaurants",
"name": null,
"icon": "restaurant",
"color": "orange",
"sort_order": 20,
"created_at": "2026-10-17T00:00:00.000Z",
"updated_at": "2026-10-17T00:00:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 2
}
],
"accounts": [
{
"id": "0192a003-0000-7000-8000-000000000001",
"name": "Vardag",
"default_shares": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 5000
}
],
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T07:10:00.000Z",
"updated_at": "2026-10-17T07:10:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 13
}
],
"recurring_templates": [
{
"id": "0192a004-0000-7000-8000-000000000001",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000003",
"amount_ore": 1250000,
"description": "Hyra",
"notes": "",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "ratio",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 6000,
"share_ore": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 4000,
"share_ore": null
}
],
"day_of_month": 25,
"start_period": "2026-10",
"end_period": null,
"paused": false,
"last_generated_period": "2026-10",
"next_occurrence_date": "2026-11-25",
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T06:30:02.004Z",
"updated_at": "2026-10-25T05:00:00.031Z",
"deleted_at": null,
"server_version": 921
}
],
"expenses": [
{
"id": "01929c5e-1111-7aaa-8bbb-000000000001",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000001",
"amount_ore": 41200,
"description": "ICA Maxi",
"notes": "",
"expense_date": "2026-10-16",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "default",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 20600,
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 20600,
"share_bp": 5000
}
],
"recurring_template_id": null,
"recurring_period": null,
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-16T17:02:11.123Z",
"updated_at": "2026-10-16T17:02:11.123Z",
"deleted_at": null,
"server_version": 913
},
{
"id": "01929c5e-1111-7aaa-8bbb-000000000002",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000002",
"amount_ore": 1001,
"description": "Fika",
"notes": "Kanelbullar\noch kaffe",
"expense_date": "2026-10-15",
"payer_user_id": "0192a000-0000-7000-8000-000000000002",
"split_mode": "exact",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 701,
"share_bp": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 300,
"share_bp": null
}
],
"recurring_template_id": null,
"recurring_period": null,
"created_by_user_id": "0192a000-0000-7000-8000-000000000002",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000002",
"created_at": "2026-10-15T10:00:00.000Z",
"updated_at": "2026-10-15T10:00:00.000Z",
"deleted_at": null,
"server_version": 914
},
{
"id": "01929c5e-1111-7aaa-8bbb-000000000003",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000003",
"amount_ore": 1250000,
"description": "Hyra",
"notes": "",
"expense_date": "2026-10-25",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "ratio",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 750000,
"share_bp": 6000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 500000,
"share_bp": 4000
}
],
"recurring_template_id": "0192a004-0000-7000-8000-000000000001",
"recurring_period": "2026-10",
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-25T05:00:00.031Z",
"updated_at": "2026-10-25T05:00:00.031Z",
"deleted_at": null,
"server_version": 919
}
],
"settlements": [
{
"id": "0192a005-0000-7000-8000-000000000001",
"from_user_id": "0192a000-0000-7000-8000-000000000002",
"to_user_id": "0192a000-0000-7000-8000-000000000001",
"amount_ore": 50000,
"settlement_date": "2026-10-16",
"note": "Swish",
"allocations": [
{
"account_id": "0192a003-0000-7000-8000-000000000001",
"amount_ore": 30000
},
{
"account_id": "0192a003-0000-7000-8000-000000000002",
"amount_ore": 20000
}
],
"created_by_user_id": "0192a000-0000-7000-8000-000000000002",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000002",
"created_at": "2026-10-16T18:00:00.000Z",
"updated_at": "2026-10-16T18:00:00.000Z",
"deleted_at": null,
"server_version": 915
}
],
"audit_entries": [
{
"id": "0192a006-0000-7000-8000-000000000001",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000001",
"action": "create",
"source": "app",
"actor_user_id": "0192a000-0000-7000-8000-000000000001",
"client_at": "2026-10-16T17:02:11.123Z",
"server_at": "2026-10-16T17:02:12.480Z",
"changes": [
{
"field": "account_id",
"old": null,
"new": "0192a003-0000-7000-8000-000000000001"
},
{
"field": "category_id",
"old": null,
"new": "01920000-0000-7000-8000-000000000001"
},
{
"field": "payer_user_id",
"old": null,
"new": "0192a000-0000-7000-8000-000000000001"
},
{
"field": "amount_ore",
"old": null,
"new": 41200
},
{
"field": "description",
"old": null,
"new": "ICA Maxi"
},
{
"field": "notes",
"old": null,
"new": ""
},
{
"field": "expense_date",
"old": null,
"new": "2026-10-16"
},
{
"field": "split_mode",
"old": null,
"new": "default"
},
{
"field": "splits",
"old": null,
"new": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 20600,
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 20600,
"share_bp": 5000
}
]
}
],
"server_version": 916
},
{
"id": "0192a006-0000-7000-8000-000000000002",
"entity_type": "settlement",
"entity_id": "0192a005-0000-7000-8000-000000000001",
"action": "update",
"source": "app",
"actor_user_id": "0192a000-0000-7000-8000-000000000002",
"client_at": "2026-10-16T18:05:00.000Z",
"server_at": "2026-10-16T18:05:01.200Z",
"changes": [
{
"field": "note",
"old": "",
"new": "Swish"
}
],
"server_version": 917
}
]
}
@@ -0,0 +1,59 @@
{
"mutations": [
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8d9e",
"entity_type": "expense",
"entity": {
"id": "01929c5e-1111-7aaa-8bbb-000000000001",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000001",
"amount_ore": 41200,
"description": "ICA Maxi",
"notes": "",
"expense_date": "2026-10-16",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "default",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 20600,
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 20600,
"share_bp": 5000
}
],
"created_at": "2026-10-16T17:02:11.123Z",
"updated_at": "2026-10-16T17:02:11.123Z",
"deleted_at": null
}
},
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8d9f",
"entity_type": "settlement",
"entity": {
"id": "0192a005-0000-7000-8000-000000000001",
"from_user_id": "0192a000-0000-7000-8000-000000000002",
"to_user_id": "0192a000-0000-7000-8000-000000000001",
"amount_ore": 50000,
"settlement_date": "2026-10-16",
"note": "Swish",
"allocations": [
{
"account_id": "0192a003-0000-7000-8000-000000000001",
"amount_ore": 30000
},
{
"account_id": "0192a003-0000-7000-8000-000000000002",
"amount_ore": 20000
}
],
"created_at": "2026-10-16T18:00:00.000Z",
"updated_at": "2026-10-16T18:00:00.000Z",
"deleted_at": null
}
}
]
}
@@ -0,0 +1,75 @@
{
"server_time": "2026-10-17T12:00:00.000Z",
"results": [
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8d9e",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000001",
"status": "accepted",
"server_version": 913,
"entity": {
"id": "01929c5e-1111-7aaa-8bbb-000000000001",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000001",
"amount_ore": 41200,
"description": "ICA Maxi",
"notes": "",
"expense_date": "2026-10-16",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "default",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 20600,
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 20600,
"share_bp": 5000
}
],
"recurring_template_id": null,
"recurring_period": null,
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-16T17:02:11.123Z",
"updated_at": "2026-10-16T17:02:11.123Z",
"deleted_at": null,
"server_version": 913
}
},
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8d9f",
"entity_type": "settlement",
"entity_id": "0192a005-0000-7000-8000-000000000001",
"status": "rejected",
"reason": "stale",
"message": "a newer version exists",
"current": {
"id": "0192a005-0000-7000-8000-000000000001",
"from_user_id": "0192a000-0000-7000-8000-000000000002",
"to_user_id": "0192a000-0000-7000-8000-000000000001",
"amount_ore": 50000,
"settlement_date": "2026-10-16",
"note": "Swish okt",
"allocations": [
{
"account_id": "0192a003-0000-7000-8000-000000000001",
"amount_ore": 30000
},
{
"account_id": "0192a003-0000-7000-8000-000000000002",
"amount_ore": 20000
}
],
"created_by_user_id": "0192a000-0000-7000-8000-000000000002",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000002",
"created_at": "2026-10-16T18:00:00.000Z",
"updated_at": "2026-10-16T19:00:00.000Z",
"deleted_at": null,
"server_version": 918
}
}
]
}
@@ -0,0 +1,5 @@
{
"payer_user_id": "0192a000-0000-7000-8000-000000000002",
"amount_ore": 60000,
"exclude_settlement_id": null
}
@@ -0,0 +1,16 @@
{
"allocations": [
{
"account_id": "0192a003-0000-7000-8000-000000000001",
"amount_ore": 30000
},
{
"account_id": "0192a003-0000-7000-8000-000000000002",
"amount_ore": 30000
}
],
"excess_ore": 10000,
"over_settled_account_ids": [
"0192a003-0000-7000-8000-000000000002"
]
}
@@ -0,0 +1,8 @@
{
"version_code": 412,
"version_name": "2026.11.02-1a2b3c4",
"file_name": "kvitt-412.apk",
"size_bytes": 18234567,
"sha256": "9f2c4d1e8b7a6f5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c0b9a8f7e6d5c4b3a2f1e",
"released_at": "2026-11-02T19:40:00.000Z"
}
+42
View File
@@ -0,0 +1,42 @@
{
"user": {
"id": "0192a000-0000-7000-8000-000000000001",
"role": "admin",
"display_name": "Jacob",
"picture_version": null,
"created_at": "2026-10-17T06:12:40.512Z",
"updated_at": "2026-10-17T06:12:40.512Z",
"server_version": 11
},
"device": {
"id": "0192a001-0000-7000-8000-000000000001",
"user_id": "0192a000-0000-7000-8000-000000000001",
"name": "Galaxy S26",
"app_version_code": 41,
"created_at": "2026-10-17T06:12:40.512Z",
"last_seen_at": "2026-10-17T09:00:00.000Z",
"revoked_at": null,
"is_current": true
},
"household": [
{
"id": "0192a000-0000-7000-8000-000000000001",
"role": "admin",
"display_name": "Jacob",
"picture_version": null,
"created_at": "2026-10-17T06:12:40.512Z",
"updated_at": "2026-10-17T06:12:40.512Z",
"server_version": 11
},
{
"id": "0192a000-0000-7000-8000-000000000002",
"role": "member",
"display_name": "Anna",
"picture_version": 2,
"created_at": "2026-10-17T07:01:15.000Z",
"updated_at": "2026-10-17T07:05:00.250Z",
"server_version": 12
}
],
"public_url": "https://icehack.asuscomm.com:8443"
}
@@ -0,0 +1,3 @@
{
"display_name": "Jacob H"
}
@@ -0,0 +1,9 @@
{
"id": "0192a000-0000-7000-8000-000000000001",
"role": "admin",
"display_name": "Jacob H",
"picture_version": null,
"created_at": "2026-10-17T06:12:40.512Z",
"updated_at": "2026-10-17T09:10:00.000Z",
"server_version": 40
}
@@ -0,0 +1,9 @@
{
"id": "0192a000-0000-7000-8000-000000000001",
"role": "admin",
"display_name": "Jacob",
"picture_version": 1,
"created_at": "2026-10-17T06:12:40.512Z",
"updated_at": "2026-10-17T09:11:00.000Z",
"server_version": 41
}
@@ -0,0 +1,5 @@
{
"code": "account_not_empty",
"message": "account is referenced by expenses, settlements or templates",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "batch_too_large",
"message": "more than 100 mutations",
"field": "mutations"
}
@@ -0,0 +1,5 @@
{
"code": "cannot_revoke_current_device",
"message": "cannot revoke the calling device",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "category_in_use",
"message": "category is used by expenses or templates",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "category_is_default",
"message": "default categories cannot be deleted",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "cursor_ahead",
"message": "since is greater than the current sequence value",
"field": "since"
}
@@ -0,0 +1,5 @@
{
"code": "device_revoked",
"message": "device is revoked",
"field": null
}
+5
View File
@@ -0,0 +1,5 @@
{
"code": "forbidden",
"message": "role member may not manage invites",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "household_full",
"message": "the household already has two users",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "household_incomplete",
"message": "the partner has not joined yet",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "image_invalid",
"message": "picture cannot be decoded",
"field": null
}
+5
View File
@@ -0,0 +1,5 @@
{
"code": "internal",
"message": "internal error, request id 0192a0ff-0000-7000-8000-000000000001",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "invalid_request",
"message": "missing field `device_name`",
"field": "device_name"
}
@@ -0,0 +1,5 @@
{
"code": "invite_invalid",
"message": "invite code is not valid",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "name_taken",
"message": "an account with this name exists",
"field": "name"
}
@@ -0,0 +1,5 @@
{
"code": "no_accounts",
"message": "no_accounts",
"field": null
}
+5
View File
@@ -0,0 +1,5 @@
{
"code": "not_found",
"message": "no such account",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "not_implemented",
"message": "not implemented",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "payload_too_large",
"message": "body exceeds 1 MiB",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "protocol_unsupported",
"message": "X-Kvitt-Protocol must be 1",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "rate_limited",
"message": "too many requests",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "unauthorized",
"message": "missing or unknown bearer token",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "unavailable",
"message": "database busy",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "unsupported_media_type",
"message": "picture must be image/jpeg, image/png or image/webp",
"field": null
}
@@ -0,0 +1,5 @@
{
"code": "validation_failed",
"message": "amount_ore must be between 1 and 1000000000",
"field": "amount_ore"
}
@@ -0,0 +1,17 @@
{
"message": {
"token": "dGhpcyBpcyBhbiBleGFtcGxlIGZjbSB0b2tlbg",
"android": {
"priority": "high",
"ttl": "86400s"
},
"data": {
"v": "1",
"type": "expense_created",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000001",
"actor_user_id": "0192a000-0000-7000-8000-000000000001",
"count": "1"
}
}
}
@@ -0,0 +1,17 @@
{
"message": {
"token": "dGhpcyBpcyBhbiBleGFtcGxlIGZjbSB0b2tlbg",
"android": {
"priority": "high",
"ttl": "86400s"
},
"data": {
"v": "1",
"type": "expense_deleted",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000001",
"actor_user_id": "0192a000-0000-7000-8000-000000000001",
"count": "1"
}
}
}
@@ -0,0 +1,17 @@
{
"message": {
"token": "dGhpcyBpcyBhbiBleGFtcGxlIGZjbSB0b2tlbg",
"android": {
"priority": "high",
"ttl": "86400s"
},
"data": {
"v": "1",
"type": "expense_updated",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000001",
"actor_user_id": "0192a000-0000-7000-8000-000000000002",
"count": "1"
}
}
}
@@ -0,0 +1,17 @@
{
"message": {
"token": "dGhpcyBpcyBhbiBleGFtcGxlIGZjbSB0b2tlbg",
"android": {
"priority": "high",
"ttl": "86400s"
},
"data": {
"v": "1",
"type": "recurring_expense_created",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000003",
"actor_user_id": "0192a000-0000-7000-8000-000000000001",
"count": "1"
}
}
}
@@ -0,0 +1,17 @@
{
"message": {
"token": "dGhpcyBpcyBhbiBleGFtcGxlIGZjbSB0b2tlbg",
"android": {
"priority": "high",
"ttl": "86400s"
},
"data": {
"v": "1",
"type": "settlement_created",
"entity_type": "settlement",
"entity_id": "0192a005-0000-7000-8000-000000000001",
"actor_user_id": "0192a000-0000-7000-8000-000000000002",
"count": "1"
}
}
}
@@ -0,0 +1,17 @@
{
"message": {
"token": "dGhpcyBpcyBhbiBleGFtcGxlIGZjbSB0b2tlbg",
"android": {
"priority": "high",
"ttl": "86400s"
},
"data": {
"v": "1",
"type": "settlement_deleted",
"entity_type": "settlement",
"entity_id": "0192a005-0000-7000-8000-000000000001",
"actor_user_id": "0192a000-0000-7000-8000-000000000001",
"count": "1"
}
}
}
@@ -0,0 +1,17 @@
{
"message": {
"token": "dGhpcyBpcyBhbiBleGFtcGxlIGZjbSB0b2tlbg",
"android": {
"priority": "high",
"ttl": "86400s"
},
"data": {
"v": "1",
"type": "settlement_updated",
"entity_type": "settlement",
"entity_id": "0192a005-0000-7000-8000-000000000001",
"actor_user_id": "0192a000-0000-7000-8000-000000000002",
"count": "1"
}
}
}
+17
View File
@@ -0,0 +1,17 @@
{
"message": {
"token": "dGhpcyBpcyBhbiBleGFtcGxlIGZjbSB0b2tlbg",
"android": {
"priority": "high",
"ttl": "86400s"
},
"data": {
"v": "1",
"type": "sync_batch",
"entity_type": "",
"entity_id": "",
"actor_user_id": "0192a000-0000-7000-8000-000000000002",
"count": "4"
}
}
}
@@ -0,0 +1,14 @@
{
"epoch": "30b85fb529aac0016dc91650841005b9",
"since": 921,
"next_since": 921,
"has_more": false,
"server_time": "2026-10-25T12:00:05.000Z",
"users": [],
"categories": [],
"accounts": [],
"recurring_templates": [],
"expenses": [],
"settlements": [],
"audit_entries": []
}
+323
View File
@@ -0,0 +1,323 @@
{
"epoch": "30b85fb529aac0016dc91650841005b9",
"since": 0,
"next_since": 921,
"has_more": true,
"server_time": "2026-10-25T12:00:00.000Z",
"users": [
{
"id": "0192a000-0000-7000-8000-000000000001",
"role": "admin",
"display_name": "Jacob",
"picture_version": null,
"created_at": "2026-10-17T06:12:40.512Z",
"updated_at": "2026-10-17T06:12:40.512Z",
"server_version": 11
},
{
"id": "0192a000-0000-7000-8000-000000000002",
"role": "member",
"display_name": "Anna",
"picture_version": 2,
"created_at": "2026-10-17T07:01:15.000Z",
"updated_at": "2026-10-17T07:05:00.250Z",
"server_version": 12
}
],
"categories": [
{
"id": "01920000-0000-7000-8000-000000000001",
"default_key": "groceries",
"name": null,
"icon": "shopping_cart",
"color": "green",
"sort_order": 10,
"created_at": "2026-10-17T00:00:00.000Z",
"updated_at": "2026-10-17T00:00:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 1
},
{
"id": "01920000-0000-7000-8000-000000000002",
"default_key": "restaurants",
"name": null,
"icon": "restaurant",
"color": "orange",
"sort_order": 20,
"created_at": "2026-10-17T00:00:00.000Z",
"updated_at": "2026-10-17T00:00:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 2
}
],
"accounts": [
{
"id": "0192a003-0000-7000-8000-000000000001",
"name": "Vardag",
"default_shares": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 5000
}
],
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T07:10:00.000Z",
"updated_at": "2026-10-17T07:10:00.000Z",
"archived_at": null,
"deleted_at": null,
"server_version": 13
}
],
"recurring_templates": [
{
"id": "0192a004-0000-7000-8000-000000000001",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000003",
"amount_ore": 1250000,
"description": "Hyra",
"notes": "",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "ratio",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_bp": 6000,
"share_ore": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_bp": 4000,
"share_ore": null
}
],
"day_of_month": 25,
"start_period": "2026-10",
"end_period": null,
"paused": false,
"last_generated_period": "2026-10",
"next_occurrence_date": "2026-11-25",
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-17T06:30:02.004Z",
"updated_at": "2026-10-25T05:00:00.031Z",
"deleted_at": null,
"server_version": 921
}
],
"expenses": [
{
"id": "01929c5e-1111-7aaa-8bbb-000000000001",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000001",
"amount_ore": 41200,
"description": "ICA Maxi",
"notes": "",
"expense_date": "2026-10-16",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "default",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 20600,
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 20600,
"share_bp": 5000
}
],
"recurring_template_id": null,
"recurring_period": null,
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-16T17:02:11.123Z",
"updated_at": "2026-10-16T17:02:11.123Z",
"deleted_at": null,
"server_version": 913
},
{
"id": "01929c5e-1111-7aaa-8bbb-000000000002",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000002",
"amount_ore": 1001,
"description": "Fika",
"notes": "Kanelbullar\noch kaffe",
"expense_date": "2026-10-15",
"payer_user_id": "0192a000-0000-7000-8000-000000000002",
"split_mode": "exact",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 701,
"share_bp": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 300,
"share_bp": null
}
],
"recurring_template_id": null,
"recurring_period": null,
"created_by_user_id": "0192a000-0000-7000-8000-000000000002",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000002",
"created_at": "2026-10-15T10:00:00.000Z",
"updated_at": "2026-10-15T10:00:00.000Z",
"deleted_at": null,
"server_version": 914
},
{
"id": "01929c5e-1111-7aaa-8bbb-000000000003",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000003",
"amount_ore": 1250000,
"description": "Hyra",
"notes": "",
"expense_date": "2026-10-25",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "ratio",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 750000,
"share_bp": 6000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 500000,
"share_bp": 4000
}
],
"recurring_template_id": "0192a004-0000-7000-8000-000000000001",
"recurring_period": "2026-10",
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-25T05:00:00.031Z",
"updated_at": "2026-10-25T05:00:00.031Z",
"deleted_at": null,
"server_version": 919
}
],
"settlements": [
{
"id": "0192a005-0000-7000-8000-000000000001",
"from_user_id": "0192a000-0000-7000-8000-000000000002",
"to_user_id": "0192a000-0000-7000-8000-000000000001",
"amount_ore": 50000,
"settlement_date": "2026-10-16",
"note": "Swish",
"allocations": [
{
"account_id": "0192a003-0000-7000-8000-000000000001",
"amount_ore": 30000
},
{
"account_id": "0192a003-0000-7000-8000-000000000002",
"amount_ore": 20000
}
],
"created_by_user_id": "0192a000-0000-7000-8000-000000000002",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000002",
"created_at": "2026-10-16T18:00:00.000Z",
"updated_at": "2026-10-16T18:00:00.000Z",
"deleted_at": null,
"server_version": 915
}
],
"audit_entries": [
{
"id": "0192a006-0000-7000-8000-000000000001",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000001",
"action": "create",
"source": "app",
"actor_user_id": "0192a000-0000-7000-8000-000000000001",
"client_at": "2026-10-16T17:02:11.123Z",
"server_at": "2026-10-16T17:02:12.480Z",
"changes": [
{
"field": "account_id",
"old": null,
"new": "0192a003-0000-7000-8000-000000000001"
},
{
"field": "category_id",
"old": null,
"new": "01920000-0000-7000-8000-000000000001"
},
{
"field": "payer_user_id",
"old": null,
"new": "0192a000-0000-7000-8000-000000000001"
},
{
"field": "amount_ore",
"old": null,
"new": 41200
},
{
"field": "description",
"old": null,
"new": "ICA Maxi"
},
{
"field": "notes",
"old": null,
"new": ""
},
{
"field": "expense_date",
"old": null,
"new": "2026-10-16"
},
{
"field": "split_mode",
"old": null,
"new": "default"
},
{
"field": "splits",
"old": null,
"new": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 20600,
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 20600,
"share_bp": 5000
}
]
}
],
"server_version": 916
},
{
"id": "0192a006-0000-7000-8000-000000000002",
"entity_type": "settlement",
"entity_id": "0192a005-0000-7000-8000-000000000001",
"action": "update",
"source": "app",
"actor_user_id": "0192a000-0000-7000-8000-000000000002",
"client_at": "2026-10-16T18:05:00.000Z",
"server_at": "2026-10-16T18:05:01.200Z",
"changes": [
{
"field": "note",
"old": "",
"new": "Swish"
}
],
"server_version": 917
}
]
}
@@ -0,0 +1,34 @@
{
"mutations": [
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8da0",
"entity_type": "expense",
"entity": {
"id": "01929c5e-1111-7aaa-8bbb-000000000002",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000002",
"amount_ore": 1001,
"description": "Fika",
"notes": "Kanelbullar\noch kaffe",
"expense_date": "2026-10-15",
"payer_user_id": "0192a000-0000-7000-8000-000000000002",
"split_mode": "exact",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 701,
"share_bp": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 300,
"share_bp": null
}
],
"created_at": "2026-10-15T10:00:00.000Z",
"updated_at": "2026-10-17T08:00:00.000Z",
"deleted_at": "2026-10-17T08:00:00.000Z"
}
}
]
}
@@ -0,0 +1,124 @@
{
"mutations": [
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8da3",
"entity_type": "expense",
"entity": {
"id": "01929c5e-1111-7aaa-8bbb-000000000002",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000002",
"amount_ore": 1001,
"description": "Fika på stan",
"notes": "Kanelbullar\noch kaffe",
"expense_date": "2026-10-15",
"payer_user_id": "0192a000-0000-7000-8000-000000000002",
"split_mode": "exact",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 701,
"share_bp": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 300,
"share_bp": null
}
],
"created_at": "2026-10-15T10:00:00.000Z",
"updated_at": "2026-10-17T09:00:00.000Z",
"deleted_at": null
}
},
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8da4",
"entity_type": "expense",
"entity": {
"id": "01929c5e-1111-7aaa-8bbb-000000000004",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000001",
"amount_ore": 41200,
"description": "ICA Maxi",
"notes": "",
"expense_date": "2026-10-16",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "default",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 20000,
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 21200,
"share_bp": 5000
}
],
"created_at": "2026-10-16T17:02:11.123Z",
"updated_at": "2026-10-16T17:02:11.123Z",
"deleted_at": null
}
},
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8da1",
"entity_type": "expense",
"entity": {
"id": "01929c5e-1111-7aaa-8bbb-000000000005",
"account_id": "0192a003-0000-7000-8000-000000000002",
"category_id": "01920000-0000-7000-8000-000000000001",
"amount_ore": 41200,
"description": "ICA Maxi",
"notes": "",
"expense_date": "2026-10-16",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "default",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 20600,
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 20600,
"share_bp": 5000
}
],
"created_at": "2026-10-16T17:02:11.123Z",
"updated_at": "2026-10-16T17:02:11.123Z",
"deleted_at": null
}
},
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8da2",
"entity_type": "expense",
"entity": {
"id": "01929c5e-1111-7aaa-8bbb-000000000006",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000001",
"amount_ore": 41200,
"description": "ICA Maxi",
"notes": "",
"expense_date": "2026-10-16",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "default",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 20600,
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 20600,
"share_bp": 5000
}
],
"created_at": "2026-10-18T12:00:00.000Z",
"updated_at": "2026-10-18T12:00:00.000Z",
"deleted_at": null
}
}
]
}
+59
View File
@@ -0,0 +1,59 @@
{
"mutations": [
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8d9e",
"entity_type": "expense",
"entity": {
"id": "01929c5e-1111-7aaa-8bbb-000000000001",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000001",
"amount_ore": 41200,
"description": "ICA Maxi",
"notes": "",
"expense_date": "2026-10-16",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "default",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 20600,
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 20600,
"share_bp": 5000
}
],
"created_at": "2026-10-16T17:02:11.123Z",
"updated_at": "2026-10-16T17:02:11.123Z",
"deleted_at": null
}
},
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8d9f",
"entity_type": "settlement",
"entity": {
"id": "0192a005-0000-7000-8000-000000000001",
"from_user_id": "0192a000-0000-7000-8000-000000000002",
"to_user_id": "0192a000-0000-7000-8000-000000000001",
"amount_ore": 50000,
"settlement_date": "2026-10-16",
"note": "Swish",
"allocations": [
{
"account_id": "0192a003-0000-7000-8000-000000000001",
"amount_ore": 30000
},
{
"account_id": "0192a003-0000-7000-8000-000000000002",
"amount_ore": 20000
}
],
"created_at": "2026-10-16T18:00:00.000Z",
"updated_at": "2026-10-16T18:00:00.000Z",
"deleted_at": null
}
}
]
}
@@ -0,0 +1,43 @@
{
"server_time": "2026-10-17T08:00:01.000Z",
"results": [
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8da0",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000002",
"status": "accepted",
"server_version": 925,
"entity": {
"id": "01929c5e-1111-7aaa-8bbb-000000000002",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000002",
"amount_ore": 1001,
"description": "Fika",
"notes": "Kanelbullar\noch kaffe",
"expense_date": "2026-10-15",
"payer_user_id": "0192a000-0000-7000-8000-000000000002",
"split_mode": "exact",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 701,
"share_bp": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 300,
"share_bp": null
}
],
"recurring_template_id": null,
"recurring_period": null,
"created_by_user_id": "0192a000-0000-7000-8000-000000000002",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-15T10:00:00.000Z",
"updated_at": "2026-10-17T08:00:00.000Z",
"deleted_at": "2026-10-17T08:00:00.000Z",
"server_version": 925
}
}
]
}
@@ -0,0 +1,71 @@
{
"server_time": "2026-10-17T12:00:00.000Z",
"results": [
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8da3",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000002",
"status": "rejected",
"reason": "deleted",
"message": "the row is deleted",
"current": {
"id": "01929c5e-1111-7aaa-8bbb-000000000002",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000002",
"amount_ore": 1001,
"description": "Fika",
"notes": "Kanelbullar\noch kaffe",
"expense_date": "2026-10-15",
"payer_user_id": "0192a000-0000-7000-8000-000000000002",
"split_mode": "exact",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 701,
"share_bp": null
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 300,
"share_bp": null
}
],
"recurring_template_id": null,
"recurring_period": null,
"created_by_user_id": "0192a000-0000-7000-8000-000000000002",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-15T10:00:00.000Z",
"updated_at": "2026-10-17T08:00:00.000Z",
"deleted_at": "2026-10-17T08:00:00.000Z",
"server_version": 925
}
},
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8da4",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000004",
"status": "rejected",
"reason": "validation_failed",
"message": "share_ore does not match the split rule",
"current": null
},
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8da1",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000005",
"status": "rejected",
"reason": "reference_not_found",
"message": "account_id",
"current": null
},
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8da2",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000006",
"status": "rejected",
"reason": "clock_skew",
"message": "updated_at is more than 10 minutes ahead of server time",
"current": null
}
]
}
@@ -0,0 +1,75 @@
{
"server_time": "2026-10-17T12:00:00.000Z",
"results": [
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8d9e",
"entity_type": "expense",
"entity_id": "01929c5e-1111-7aaa-8bbb-000000000001",
"status": "accepted",
"server_version": 913,
"entity": {
"id": "01929c5e-1111-7aaa-8bbb-000000000001",
"account_id": "0192a003-0000-7000-8000-000000000001",
"category_id": "01920000-0000-7000-8000-000000000001",
"amount_ore": 41200,
"description": "ICA Maxi",
"notes": "",
"expense_date": "2026-10-16",
"payer_user_id": "0192a000-0000-7000-8000-000000000001",
"split_mode": "default",
"splits": [
{
"user_id": "0192a000-0000-7000-8000-000000000001",
"share_ore": 20600,
"share_bp": 5000
},
{
"user_id": "0192a000-0000-7000-8000-000000000002",
"share_ore": 20600,
"share_bp": 5000
}
],
"recurring_template_id": null,
"recurring_period": null,
"created_by_user_id": "0192a000-0000-7000-8000-000000000001",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000001",
"created_at": "2026-10-16T17:02:11.123Z",
"updated_at": "2026-10-16T17:02:11.123Z",
"deleted_at": null,
"server_version": 913
}
},
{
"mutation_id": "01929c5e-6c1f-7d3a-9b2e-4f5a6b7c8d9f",
"entity_type": "settlement",
"entity_id": "0192a005-0000-7000-8000-000000000001",
"status": "rejected",
"reason": "stale",
"message": "a newer version exists",
"current": {
"id": "0192a005-0000-7000-8000-000000000001",
"from_user_id": "0192a000-0000-7000-8000-000000000002",
"to_user_id": "0192a000-0000-7000-8000-000000000001",
"amount_ore": 50000,
"settlement_date": "2026-10-16",
"note": "Swish okt",
"allocations": [
{
"account_id": "0192a003-0000-7000-8000-000000000001",
"amount_ore": 30000
},
{
"account_id": "0192a003-0000-7000-8000-000000000002",
"amount_ore": 20000
}
],
"created_by_user_id": "0192a000-0000-7000-8000-000000000002",
"updated_by_user_id": "0192a000-0000-7000-8000-000000000002",
"created_at": "2026-10-16T18:00:00.000Z",
"updated_at": "2026-10-16T19:00:00.000Z",
"deleted_at": null,
"server_version": 918
}
}
]
}