@gruncellka/porto-data 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +85 -1
  2. package/LICENSE +199 -5
  3. package/README.md +52 -39
  4. package/index.d.ts +35 -18
  5. package/index.js +2 -1
  6. package/package.json +23 -9
  7. package/porto_data/formats/envelopes.json +120 -0
  8. package/porto_data/formats/layouts.json +288 -0
  9. package/porto_data/mappings.json +65 -10
  10. package/porto_data/metadata.json +662 -125
  11. package/porto_data/policy/jurisdictions.json +839 -0
  12. package/porto_data/policy/markets.json +75 -0
  13. package/porto_data/policy/restrictions.json +668 -0
  14. package/porto_data/providers/deutschepost/features.json +42 -0
  15. package/porto_data/providers/deutschepost/graph.json +203 -0
  16. package/porto_data/providers/deutschepost/limits.json +17 -0
  17. package/porto_data/providers/deutschepost/marks.json +71 -0
  18. package/porto_data/providers/deutschepost/prices/products.json +239 -0
  19. package/porto_data/providers/deutschepost/prices/services.json +51 -0
  20. package/porto_data/providers/deutschepost/products.json +197 -0
  21. package/porto_data/providers/deutschepost/services.json +88 -0
  22. package/porto_data/providers/deutschepost/weights.json +46 -0
  23. package/porto_data/providers/deutschepost/zones.json +231 -0
  24. package/porto_data/providers/laposte/features.json +42 -0
  25. package/porto_data/providers/laposte/graph.json +234 -0
  26. package/porto_data/providers/laposte/limits.json +17 -0
  27. package/porto_data/providers/laposte/marks.json +39 -0
  28. package/porto_data/providers/laposte/prices/products.json +947 -0
  29. package/porto_data/providers/laposte/prices/services.json +41 -0
  30. package/porto_data/providers/laposte/products.json +276 -0
  31. package/porto_data/providers/laposte/services.json +63 -0
  32. package/porto_data/providers/laposte/weights.json +38 -0
  33. package/porto_data/providers/laposte/zones.json +230 -0
  34. package/porto_data/providers/swisspost/features.json +21 -0
  35. package/porto_data/providers/swisspost/graph.json +212 -0
  36. package/porto_data/providers/swisspost/limits.json +17 -0
  37. package/porto_data/providers/swisspost/marks.json +41 -0
  38. package/porto_data/providers/swisspost/prices/products.json +347 -0
  39. package/porto_data/providers/swisspost/prices/services.json +31 -0
  40. package/porto_data/providers/swisspost/products.json +193 -0
  41. package/porto_data/providers/swisspost/rules.json +25 -0
  42. package/porto_data/providers/swisspost/services.json +40 -0
  43. package/porto_data/providers/swisspost/weights.json +38 -0
  44. package/porto_data/providers/swisspost/zones.json +223 -0
  45. package/porto_data/providers/ukrposhta/features.json +28 -0
  46. package/porto_data/providers/ukrposhta/graph.json +148 -0
  47. package/porto_data/providers/ukrposhta/limits.json +17 -0
  48. package/porto_data/providers/ukrposhta/marks.json +25 -0
  49. package/porto_data/providers/ukrposhta/prices/products.json +123 -0
  50. package/porto_data/providers/ukrposhta/prices/services.json +42 -0
  51. package/porto_data/providers/ukrposhta/products.json +74 -0
  52. package/porto_data/providers/ukrposhta/services.json +40 -0
  53. package/porto_data/providers/ukrposhta/weights.json +26 -0
  54. package/porto_data/providers/ukrposhta/zones.json +226 -0
  55. package/porto_data/providers.json +37 -0
  56. package/porto_data/schemas/envelopes.schema.json +120 -0
  57. package/porto_data/schemas/features.schema.json +66 -55
  58. package/porto_data/schemas/graph.schema.json +189 -0
  59. package/porto_data/schemas/jurisdictions.schema.json +116 -0
  60. package/porto_data/schemas/layouts.schema.json +156 -0
  61. package/porto_data/schemas/limits.schema.json +253 -0
  62. package/porto_data/schemas/mappings.schema.json +73 -0
  63. package/porto_data/schemas/markets.schema.json +186 -0
  64. package/porto_data/schemas/marks.schema.json +127 -0
  65. package/porto_data/schemas/metadata.schema.json +183 -0
  66. package/porto_data/schemas/porto_ids.schema.json +45 -0
  67. package/porto_data/schemas/product_prices.schema.json +126 -0
  68. package/porto_data/schemas/products.schema.json +338 -110
  69. package/porto_data/schemas/providers.schema.json +71 -0
  70. package/porto_data/schemas/restrictions.schema.json +175 -355
  71. package/porto_data/schemas/rules.schema.json +104 -0
  72. package/porto_data/schemas/service_prices.schema.json +116 -0
  73. package/porto_data/schemas/services.schema.json +113 -70
  74. package/porto_data/schemas/weights.schema.json +70 -0
  75. package/porto_data/schemas/zones.schema.json +78 -72
  76. package/porto_data/data/data_links.json +0 -148
  77. package/porto_data/data/dimensions.json +0 -158
  78. package/porto_data/data/features.json +0 -66
  79. package/porto_data/data/prices.json +0 -242
  80. package/porto_data/data/products.json +0 -84
  81. package/porto_data/data/restrictions.json +0 -795
  82. package/porto_data/data/services.json +0 -61
  83. package/porto_data/data/weight_tiers.json +0 -54
  84. package/porto_data/data/zones.json +0 -230
  85. package/porto_data/schemas/data_links.schema.json +0 -223
  86. package/porto_data/schemas/dimensions.schema.json +0 -215
  87. package/porto_data/schemas/prices.schema.json +0 -180
  88. package/porto_data/schemas/weight_tiers.schema.json +0 -70
@@ -0,0 +1,42 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/gruncellka/porto-data/refs/heads/main/porto_data/schemas/features.schema.json",
3
+ "file_type": "features",
4
+ "provider": "deutschepost",
5
+ "features": [
6
+ {
7
+ "id": "sendungsnummer",
8
+ "porto_id": "tracking_number",
9
+ "name": "Sendungsnummer",
10
+ "label": "Tracking number",
11
+ "description": "Unique tracking number (registered mail only)"
12
+ },
13
+ {
14
+ "id": "einliefernachweis",
15
+ "porto_id": "proof_of_mailing",
16
+ "name": "Einliefernachweis",
17
+ "label": "Proof of mailing",
18
+ "description": "Documentation that item was mailed"
19
+ },
20
+ {
21
+ "id": "unterschrift_empfanger",
22
+ "porto_id": "recipient_signature",
23
+ "name": "Empfängerunterschrift",
24
+ "label": "Recipient signature required",
25
+ "description": "Recipient must sign upon delivery"
26
+ },
27
+ {
28
+ "id": "rueckschein",
29
+ "porto_id": "return_receipt",
30
+ "name": "Rückschein",
31
+ "label": "Return receipt to sender",
32
+ "description": "Receipt returned to sender as proof of delivery"
33
+ },
34
+ {
35
+ "id": "zustellnachweis",
36
+ "porto_id": "proof_of_delivery",
37
+ "name": "Zustellnachweis",
38
+ "label": "Proof of delivery",
39
+ "description": "Derived from tracking status; not a separate API capability"
40
+ }
41
+ ]
42
+ }
@@ -0,0 +1,203 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/gruncellka/porto-data/refs/heads/main/porto_data/schemas/graph.schema.json",
3
+ "file_type": "graph",
4
+ "provider": "deutschepost",
5
+ "unit": {
6
+ "weight": "g",
7
+ "dimension": "mm",
8
+ "price": "cents",
9
+ "currency": "EUR"
10
+ },
11
+ "dependencies": {
12
+ "products": {
13
+ "file": "products.json",
14
+ "depends_on": [
15
+ "zones.json",
16
+ "weights.json",
17
+ "formats/envelopes.json",
18
+ "services.json",
19
+ "features.json",
20
+ "marks.json"
21
+ ],
22
+ "description": "Products require zones, weight tiers, canonical envelope format ids, services, features, and mark profiles"
23
+ },
24
+ "services": {
25
+ "file": "services.json",
26
+ "depends_on": [
27
+ "features.json"
28
+ ],
29
+ "description": "Services require features and price information"
30
+ },
31
+ "product_prices": {
32
+ "file": "prices/products.json",
33
+ "depends_on": [
34
+ "products.json",
35
+ "zones.json",
36
+ "weights.json"
37
+ ],
38
+ "description": "Base postage grid (product_id × zone × weight_tier); file providers/<id>/prices/products.json (file_type product_prices)"
39
+ },
40
+ "service_prices": {
41
+ "file": "prices/services.json",
42
+ "depends_on": [
43
+ "products.json",
44
+ "services.json",
45
+ "zones.json",
46
+ "weights.json"
47
+ ],
48
+ "description": "Service surcharge amounts; file providers/<id>/prices/services.json (file_type service_prices)"
49
+ },
50
+ "zones": {
51
+ "file": "zones.json",
52
+ "depends_on": [
53
+ "policy/restrictions.json"
54
+ ],
55
+ "description": "Zones may have restricted destinations"
56
+ },
57
+ "weights": {
58
+ "file": "weights.json",
59
+ "depends_on": [],
60
+ "description": "Weight brackets (tier ids) are standalone definitions"
61
+ },
62
+ "envelopes": {
63
+ "file": "formats/envelopes.json",
64
+ "depends_on": [],
65
+ "description": "Global envelope id catalog: physical front size (mm); international baseline (e.g. ISO 269); file formats/envelopes.json"
66
+ },
67
+ "envelope_layouts": {
68
+ "file": "formats/layouts.json",
69
+ "depends_on": [
70
+ "formats/envelopes.json"
71
+ ],
72
+ "description": "Jurisdiction-keyed print/window layout (DE/CH/FR); file formats/layouts.json"
73
+ },
74
+ "jurisdictions": {
75
+ "file": "policy/jurisdictions.json",
76
+ "depends_on": [],
77
+ "description": "UN/EU membership sets for restriction framework jurisdiction resolution"
78
+ },
79
+ "markets": {
80
+ "file": "policy/markets.json",
81
+ "depends_on": [],
82
+ "description": "Country-level currency, VAT, and international quote currencies for providers.json country"
83
+ },
84
+ "restrictions": {
85
+ "file": "policy/restrictions.json",
86
+ "depends_on": [
87
+ "policy/jurisdictions.json",
88
+ "zones.json",
89
+ "products.json"
90
+ ],
91
+ "description": "Global destination restrictions (bundled as policy/restrictions.json); optional cross-reference to zones and products"
92
+ },
93
+ "limits": {
94
+ "file": "limits.json",
95
+ "depends_on": [
96
+ "policy/restrictions.json"
97
+ ],
98
+ "description": "Provider operational limits extend global restrictions after load"
99
+ },
100
+ "features": {
101
+ "file": "features.json",
102
+ "depends_on": [],
103
+ "description": "Features are standalone definitions referenced by services"
104
+ },
105
+ "marks": {
106
+ "file": "marks.json",
107
+ "depends_on": [],
108
+ "description": "Franking profile catalog: profiles[] (sizes); resolution in graph.edges.marks"
109
+ }
110
+ },
111
+ "services": [
112
+ "einschreiben",
113
+ "einschreiben_einwurf",
114
+ "einschreiben_rueckschein",
115
+ "zusatzversicherung"
116
+ ],
117
+ "edges": {
118
+ "products": {
119
+ "standardbrief": {
120
+ "zones": [
121
+ "domestic",
122
+ "zone_1_eu",
123
+ "zone_2_europe",
124
+ "world"
125
+ ],
126
+ "weight_tiers": [
127
+ "W0020"
128
+ ]
129
+ },
130
+ "kompaktbrief": {
131
+ "zones": [
132
+ "domestic",
133
+ "zone_1_eu",
134
+ "zone_2_europe",
135
+ "world"
136
+ ],
137
+ "weight_tiers": [
138
+ "W0050"
139
+ ]
140
+ },
141
+ "grossbrief": {
142
+ "zones": [
143
+ "domestic",
144
+ "zone_1_eu",
145
+ "zone_2_europe",
146
+ "world"
147
+ ],
148
+ "weight_tiers": [
149
+ "W0500"
150
+ ]
151
+ },
152
+ "maxibrief": {
153
+ "zones": [
154
+ "domestic",
155
+ "zone_1_eu",
156
+ "zone_2_europe",
157
+ "world"
158
+ ],
159
+ "weight_tiers": [
160
+ "W1000"
161
+ ]
162
+ },
163
+ "maxibrief_international_heavy": {
164
+ "zones": [
165
+ "zone_1_eu",
166
+ "zone_2_europe",
167
+ "world"
168
+ ],
169
+ "weight_tiers": [
170
+ "W2000"
171
+ ]
172
+ }
173
+ },
174
+ "marks": {
175
+ "domestic": {
176
+ "profile": "domestic",
177
+ "services": {
178
+ "einschreiben": "registered",
179
+ "einschreiben_einwurf": "registered",
180
+ "einschreiben_rueckschein": "registered"
181
+ }
182
+ },
183
+ "zone_1_eu": {
184
+ "profile": "international",
185
+ "services": {
186
+ "einschreiben": "registered_international"
187
+ }
188
+ },
189
+ "zone_2_europe": {
190
+ "profile": "international",
191
+ "services": {
192
+ "einschreiben": "registered_international"
193
+ }
194
+ },
195
+ "world": {
196
+ "profile": "international",
197
+ "services": {
198
+ "einschreiben": "registered_international"
199
+ }
200
+ }
201
+ }
202
+ }
203
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/gruncellka/porto-data/refs/heads/main/porto_data/schemas/limits.schema.json",
3
+ "file_type": "limits",
4
+ "provider": "deutschepost",
5
+ "unit": {
6
+ "country_code": "ISO 3166-1 alpha-2",
7
+ "date": "ISO 8601"
8
+ },
9
+ "context": {
10
+ "national": {
11
+ "description": "Volatile operator rules (strikes, temporary suspensions) and SDK overlays use the same row shape as policy/restrictions.json limits[] items when present. Sanctions and destination facts (EU/UN/CH rows) live only in policy/restrictions.json under destinations[].restrictions. This file is usually empty.",
12
+ "notes": "Merge order: global restrictions, then limits[] here, then any SDK operational overlay."
13
+ }
14
+ },
15
+ "limits": [],
16
+ "frameworks": {}
17
+ }
@@ -0,0 +1,71 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/gruncellka/porto-data/refs/heads/main/porto_data/schemas/marks.schema.json",
3
+ "file_type": "marks",
4
+ "provider": "deutschepost",
5
+ "unit": {
6
+ "dimension": "mm"
7
+ },
8
+ "default_profile": "domestic",
9
+ "profiles": [
10
+ {
11
+ "id": "domestic",
12
+ "mark_type": "stamp",
13
+ "label": "Internetmarke domestic",
14
+ "description": "Standard domestic letter franking graphic",
15
+ "scope_notes": "Not from Deutsche Post official spec; measured from Internetmarke PDF samples (calibration samples/, not in git). Frankierzone placement max 74×40 mm",
16
+ "size": {
17
+ "width": 36,
18
+ "height": 16
19
+ },
20
+ "mime_type": [
21
+ "image/png",
22
+ "application/pdf"
23
+ ]
24
+ },
25
+ {
26
+ "id": "international",
27
+ "mark_type": "stamp",
28
+ "label": "Internetmarke international",
29
+ "description": "International letter franking graphic (wider footprint)",
30
+ "scope_notes": "Not from Deutsche Post official spec; measured from Internetmarke PDF samples. Includes Priority P.P. line when applicable",
31
+ "size": {
32
+ "width": 60,
33
+ "height": 16
34
+ },
35
+ "mime_type": [
36
+ "image/png",
37
+ "application/pdf"
38
+ ]
39
+ },
40
+ {
41
+ "id": "registered",
42
+ "mark_type": "stamp",
43
+ "label": "Internetmarke registered domestic",
44
+ "description": "Domestic registered (Einschreiben) franking graphic",
45
+ "scope_notes": "Not from Deutsche Post official spec; measured from Internetmarke PDF samples. Einschreiben Einwurf / Rückschein and domestic Einschreiben",
46
+ "size": {
47
+ "width": 57,
48
+ "height": 21
49
+ },
50
+ "mime_type": [
51
+ "image/png",
52
+ "application/pdf"
53
+ ]
54
+ },
55
+ {
56
+ "id": "registered_international",
57
+ "mark_type": "stamp",
58
+ "label": "Internetmarke registered international",
59
+ "description": "International registered franking graphic",
60
+ "scope_notes": "Not from Deutsche Post official spec; measured from Internetmarke PDF samples. International Einschreiben; taller footprint with barcode and service lines",
61
+ "size": {
62
+ "width": 57,
63
+ "height": 30
64
+ },
65
+ "mime_type": [
66
+ "image/png",
67
+ "application/pdf"
68
+ ]
69
+ }
70
+ ]
71
+ }
@@ -0,0 +1,239 @@
1
+ {
2
+ "provider": "deutschepost",
3
+ "unit": {
4
+ "price": "cents",
5
+ "currency": "EUR"
6
+ },
7
+ "$schema": "https://raw.githubusercontent.com/gruncellka/porto-data/refs/heads/main/porto_data/schemas/product_prices.schema.json",
8
+ "file_type": "product_prices",
9
+ "product_prices": [
10
+ {
11
+ "product_id": "standardbrief",
12
+ "zone": "domestic",
13
+ "weight_tier": "W0020",
14
+ "price": [
15
+ {
16
+ "amount": 95,
17
+ "effective_from": "2026-01-01",
18
+ "effective_to": null
19
+ }
20
+ ]
21
+ },
22
+ {
23
+ "product_id": "standardbrief",
24
+ "zone": "zone_1_eu",
25
+ "weight_tier": "W0020",
26
+ "price": [
27
+ {
28
+ "amount": 125,
29
+ "effective_from": "2026-01-01",
30
+ "effective_to": null
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ "product_id": "standardbrief",
36
+ "zone": "zone_2_europe",
37
+ "weight_tier": "W0020",
38
+ "price": [
39
+ {
40
+ "amount": 125,
41
+ "effective_from": "2026-01-01",
42
+ "effective_to": null
43
+ }
44
+ ]
45
+ },
46
+ {
47
+ "product_id": "standardbrief",
48
+ "zone": "world",
49
+ "weight_tier": "W0020",
50
+ "price": [
51
+ {
52
+ "amount": 125,
53
+ "effective_from": "2026-01-01",
54
+ "effective_to": null
55
+ }
56
+ ]
57
+ },
58
+ {
59
+ "product_id": "kompaktbrief",
60
+ "zone": "domestic",
61
+ "weight_tier": "W0050",
62
+ "price": [
63
+ {
64
+ "amount": 110,
65
+ "effective_from": "2026-01-01",
66
+ "effective_to": null
67
+ }
68
+ ]
69
+ },
70
+ {
71
+ "product_id": "kompaktbrief",
72
+ "zone": "zone_1_eu",
73
+ "weight_tier": "W0050",
74
+ "price": [
75
+ {
76
+ "amount": 180,
77
+ "effective_from": "2026-01-01",
78
+ "effective_to": null
79
+ }
80
+ ]
81
+ },
82
+ {
83
+ "product_id": "kompaktbrief",
84
+ "zone": "zone_2_europe",
85
+ "weight_tier": "W0050",
86
+ "price": [
87
+ {
88
+ "amount": 180,
89
+ "effective_from": "2026-01-01",
90
+ "effective_to": null
91
+ }
92
+ ]
93
+ },
94
+ {
95
+ "product_id": "kompaktbrief",
96
+ "zone": "world",
97
+ "weight_tier": "W0050",
98
+ "price": [
99
+ {
100
+ "amount": 180,
101
+ "effective_from": "2026-01-01",
102
+ "effective_to": null
103
+ }
104
+ ]
105
+ },
106
+ {
107
+ "product_id": "grossbrief",
108
+ "zone": "domestic",
109
+ "weight_tier": "W0500",
110
+ "price": [
111
+ {
112
+ "amount": 180,
113
+ "effective_from": "2026-01-01",
114
+ "effective_to": null
115
+ }
116
+ ]
117
+ },
118
+ {
119
+ "product_id": "grossbrief",
120
+ "zone": "zone_1_eu",
121
+ "weight_tier": "W0500",
122
+ "price": [
123
+ {
124
+ "amount": 330,
125
+ "effective_from": "2026-01-01",
126
+ "effective_to": null
127
+ }
128
+ ]
129
+ },
130
+ {
131
+ "product_id": "grossbrief",
132
+ "zone": "zone_2_europe",
133
+ "weight_tier": "W0500",
134
+ "price": [
135
+ {
136
+ "amount": 330,
137
+ "effective_from": "2026-01-01",
138
+ "effective_to": null
139
+ }
140
+ ]
141
+ },
142
+ {
143
+ "product_id": "grossbrief",
144
+ "zone": "world",
145
+ "weight_tier": "W0500",
146
+ "price": [
147
+ {
148
+ "amount": 330,
149
+ "effective_from": "2026-01-01",
150
+ "effective_to": null
151
+ }
152
+ ]
153
+ },
154
+ {
155
+ "product_id": "maxibrief",
156
+ "zone": "domestic",
157
+ "weight_tier": "W1000",
158
+ "price": [
159
+ {
160
+ "amount": 290,
161
+ "effective_from": "2026-01-01",
162
+ "effective_to": null
163
+ }
164
+ ]
165
+ },
166
+ {
167
+ "product_id": "maxibrief",
168
+ "zone": "zone_1_eu",
169
+ "weight_tier": "W1000",
170
+ "price": [
171
+ {
172
+ "amount": 650,
173
+ "effective_from": "2026-01-01",
174
+ "effective_to": null
175
+ }
176
+ ]
177
+ },
178
+ {
179
+ "product_id": "maxibrief",
180
+ "zone": "zone_2_europe",
181
+ "weight_tier": "W1000",
182
+ "price": [
183
+ {
184
+ "amount": 650,
185
+ "effective_from": "2026-01-01",
186
+ "effective_to": null
187
+ }
188
+ ]
189
+ },
190
+ {
191
+ "product_id": "maxibrief",
192
+ "zone": "world",
193
+ "weight_tier": "W1000",
194
+ "price": [
195
+ {
196
+ "amount": 650,
197
+ "effective_from": "2026-01-01",
198
+ "effective_to": null
199
+ }
200
+ ]
201
+ },
202
+ {
203
+ "product_id": "maxibrief_international_heavy",
204
+ "zone": "zone_1_eu",
205
+ "weight_tier": "W2000",
206
+ "price": [
207
+ {
208
+ "amount": 1700,
209
+ "effective_from": "2026-01-01",
210
+ "effective_to": null
211
+ }
212
+ ]
213
+ },
214
+ {
215
+ "product_id": "maxibrief_international_heavy",
216
+ "zone": "zone_2_europe",
217
+ "weight_tier": "W2000",
218
+ "price": [
219
+ {
220
+ "amount": 1700,
221
+ "effective_from": "2026-01-01",
222
+ "effective_to": null
223
+ }
224
+ ]
225
+ },
226
+ {
227
+ "product_id": "maxibrief_international_heavy",
228
+ "zone": "world",
229
+ "weight_tier": "W2000",
230
+ "price": [
231
+ {
232
+ "amount": 1700,
233
+ "effective_from": "2026-01-01",
234
+ "effective_to": null
235
+ }
236
+ ]
237
+ }
238
+ ]
239
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "provider": "deutschepost",
3
+ "unit": {
4
+ "price": "cents",
5
+ "currency": "EUR"
6
+ },
7
+ "$schema": "https://raw.githubusercontent.com/gruncellka/porto-data/refs/heads/main/porto_data/schemas/service_prices.schema.json",
8
+ "file_type": "service_prices",
9
+ "service_prices": [
10
+ {
11
+ "service_id": "einschreiben",
12
+ "price": [
13
+ {
14
+ "amount": 265,
15
+ "effective_from": "2026-01-01",
16
+ "effective_to": null
17
+ }
18
+ ]
19
+ },
20
+ {
21
+ "service_id": "einschreiben_einwurf",
22
+ "price": [
23
+ {
24
+ "amount": 235,
25
+ "effective_from": "2026-01-01",
26
+ "effective_to": null
27
+ }
28
+ ]
29
+ },
30
+ {
31
+ "service_id": "einschreiben_rueckschein",
32
+ "price": [
33
+ {
34
+ "amount": 485,
35
+ "effective_from": "2026-01-01",
36
+ "effective_to": null
37
+ }
38
+ ]
39
+ },
40
+ {
41
+ "service_id": "zusatzversicherung",
42
+ "price": [
43
+ {
44
+ "amount": 250,
45
+ "effective_from": "2026-01-01",
46
+ "effective_to": null
47
+ }
48
+ ]
49
+ }
50
+ ]
51
+ }