@epilot/sdk 2.4.4 → 2.6.0

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 (215) hide show
  1. package/definitions/app.json +137 -58
  2. package/definitions/customer-portal-runtime.json +1 -1
  3. package/definitions/customer-portal.json +496 -24
  4. package/definitions/entity.json +185 -8
  5. package/definitions/integration-toolkit-runtime.json +1 -1
  6. package/definitions/integration-toolkit.json +480 -4
  7. package/definitions/metering-runtime.json +1 -1
  8. package/definitions/metering.json +728 -64
  9. package/definitions/webhooks-runtime.json +1 -1
  10. package/definitions/webhooks.json +134 -4
  11. package/dist/apis/access-token.cjs +6 -6
  12. package/dist/apis/access-token.js +1 -1
  13. package/dist/apis/address-suggestions.cjs +6 -6
  14. package/dist/apis/address-suggestions.js +1 -1
  15. package/dist/apis/address.cjs +6 -6
  16. package/dist/apis/address.js +1 -1
  17. package/dist/apis/ai-agents.cjs +6 -6
  18. package/dist/apis/ai-agents.js +1 -1
  19. package/dist/apis/app.cjs +8 -8
  20. package/dist/apis/app.d.cts +2 -2
  21. package/dist/apis/app.d.ts +2 -2
  22. package/dist/apis/app.js +2 -2
  23. package/dist/apis/audit-logs.cjs +6 -6
  24. package/dist/apis/audit-logs.js +1 -1
  25. package/dist/apis/automation.cjs +6 -6
  26. package/dist/apis/automation.js +1 -1
  27. package/dist/apis/billing.cjs +6 -6
  28. package/dist/apis/billing.js +1 -1
  29. package/dist/apis/blueprint-manifest.cjs +6 -6
  30. package/dist/apis/blueprint-manifest.js +1 -1
  31. package/dist/apis/calendar.cjs +6 -6
  32. package/dist/apis/calendar.js +1 -1
  33. package/dist/apis/configuration-hub.cjs +6 -6
  34. package/dist/apis/configuration-hub.js +1 -1
  35. package/dist/apis/consent.cjs +6 -6
  36. package/dist/apis/consent.js +1 -1
  37. package/dist/apis/customer-portal.cjs +8 -8
  38. package/dist/apis/customer-portal.d.cts +2 -2
  39. package/dist/apis/customer-portal.d.ts +2 -2
  40. package/dist/apis/customer-portal.js +2 -2
  41. package/dist/apis/dashboard.cjs +6 -6
  42. package/dist/apis/dashboard.js +1 -1
  43. package/dist/apis/data-governance.cjs +6 -6
  44. package/dist/apis/data-governance.js +1 -1
  45. package/dist/apis/deduplication.cjs +6 -6
  46. package/dist/apis/deduplication.js +1 -1
  47. package/dist/apis/design.cjs +6 -6
  48. package/dist/apis/design.js +1 -1
  49. package/dist/apis/document.cjs +6 -6
  50. package/dist/apis/document.js +1 -1
  51. package/dist/apis/email-settings.cjs +6 -6
  52. package/dist/apis/email-settings.js +1 -1
  53. package/dist/apis/email-template.cjs +6 -6
  54. package/dist/apis/email-template.js +1 -1
  55. package/dist/apis/entity-mapping.cjs +6 -6
  56. package/dist/apis/entity-mapping.js +1 -1
  57. package/dist/apis/entity.cjs +6 -6
  58. package/dist/apis/entity.d.cts +2 -2
  59. package/dist/apis/entity.d.ts +2 -2
  60. package/dist/apis/entity.js +1 -1
  61. package/dist/apis/environments.cjs +6 -6
  62. package/dist/apis/environments.js +1 -1
  63. package/dist/apis/event-catalog.cjs +6 -6
  64. package/dist/apis/event-catalog.js +1 -1
  65. package/dist/apis/file.cjs +6 -6
  66. package/dist/apis/file.js +1 -1
  67. package/dist/apis/iban.cjs +6 -6
  68. package/dist/apis/iban.js +1 -1
  69. package/dist/apis/integration-toolkit.cjs +8 -8
  70. package/dist/apis/integration-toolkit.d.cts +2 -2
  71. package/dist/apis/integration-toolkit.d.ts +2 -2
  72. package/dist/apis/integration-toolkit.js +2 -2
  73. package/dist/apis/journey.cjs +6 -6
  74. package/dist/apis/journey.js +1 -1
  75. package/dist/apis/kanban.cjs +6 -6
  76. package/dist/apis/kanban.js +1 -1
  77. package/dist/apis/message.cjs +6 -6
  78. package/dist/apis/message.js +1 -1
  79. package/dist/apis/metering.cjs +8 -8
  80. package/dist/apis/metering.d.cts +2 -2
  81. package/dist/apis/metering.d.ts +2 -2
  82. package/dist/apis/metering.js +2 -2
  83. package/dist/apis/notes.cjs +6 -6
  84. package/dist/apis/notes.d.cts +2 -2
  85. package/dist/apis/notes.d.ts +2 -2
  86. package/dist/apis/notes.js +1 -1
  87. package/dist/apis/notification.cjs +6 -6
  88. package/dist/apis/notification.js +1 -1
  89. package/dist/apis/organization.cjs +6 -6
  90. package/dist/apis/organization.js +1 -1
  91. package/dist/apis/partner-directory.cjs +6 -6
  92. package/dist/apis/partner-directory.js +1 -1
  93. package/dist/apis/permissions.cjs +6 -6
  94. package/dist/apis/permissions.js +1 -1
  95. package/dist/apis/pricing-tier.cjs +6 -6
  96. package/dist/apis/pricing-tier.js +1 -1
  97. package/dist/apis/pricing.cjs +6 -6
  98. package/dist/apis/pricing.js +1 -1
  99. package/dist/apis/purpose.cjs +6 -6
  100. package/dist/apis/purpose.js +1 -1
  101. package/dist/apis/query.cjs +6 -6
  102. package/dist/apis/query.js +1 -1
  103. package/dist/apis/sandbox.cjs +6 -6
  104. package/dist/apis/sandbox.js +1 -1
  105. package/dist/apis/sharing.cjs +6 -6
  106. package/dist/apis/sharing.js +1 -1
  107. package/dist/apis/submission.cjs +6 -6
  108. package/dist/apis/submission.js +1 -1
  109. package/dist/apis/target.cjs +6 -6
  110. package/dist/apis/target.js +1 -1
  111. package/dist/apis/targeting.cjs +6 -6
  112. package/dist/apis/targeting.js +1 -1
  113. package/dist/apis/template-variables.cjs +6 -6
  114. package/dist/apis/template-variables.js +1 -1
  115. package/dist/apis/user.cjs +6 -6
  116. package/dist/apis/user.js +1 -1
  117. package/dist/apis/validation-rules.cjs +6 -6
  118. package/dist/apis/validation-rules.js +1 -1
  119. package/dist/apis/webhooks.cjs +8 -8
  120. package/dist/apis/webhooks.d.cts +2 -2
  121. package/dist/apis/webhooks.d.ts +2 -2
  122. package/dist/apis/webhooks.js +2 -2
  123. package/dist/apis/workflow-definition.cjs +6 -6
  124. package/dist/apis/workflow-definition.js +1 -1
  125. package/dist/apis/workflow.cjs +6 -6
  126. package/dist/apis/workflow.js +1 -1
  127. package/dist/app-34OBBTA4.js +7 -0
  128. package/dist/app-SSF545U7.cjs +7 -0
  129. package/dist/app-runtime-AFNM67YN.cjs +5 -0
  130. package/dist/{app-runtime-U7RGV7KT.js → app-runtime-DBUXZL6E.js} +1 -1
  131. package/dist/{app.d-u7Dq42kU.d.cts → app.d--5n0FQQ4.d.cts} +377 -11
  132. package/dist/{app.d-u7Dq42kU.d.ts → app.d--5n0FQQ4.d.ts} +377 -11
  133. package/dist/bin/cli.js +1 -1
  134. package/dist/{chunk-JTFWOEZF.cjs → chunk-4FFGRWLS.cjs} +1 -1
  135. package/dist/chunk-56MMZJOD.js +14 -0
  136. package/dist/chunk-5OBMZHRL.cjs +14 -0
  137. package/dist/{chunk-L66IX6GX.cjs → chunk-KMVJYNLB.cjs} +1 -1
  138. package/dist/chunk-KYCVV2XE.cjs +14 -0
  139. package/dist/{chunk-TSV242UN.js → chunk-QNUU4TTU.js} +13 -13
  140. package/dist/chunk-RGO3LTAM.js +14 -0
  141. package/dist/{chunk-CD4OX2U6.cjs → chunk-SDIGGISZ.cjs} +13 -13
  142. package/dist/chunk-T6A22LSD.cjs +14 -0
  143. package/dist/chunk-WM74R3BD.js +14 -0
  144. package/dist/{chunk-LLZYRINH.js → chunk-Z4H2FZ2K.js} +1 -1
  145. package/dist/chunk-Z6HGUGXK.js +14 -0
  146. package/dist/customer-portal-5I7ZGQDU.cjs +7 -0
  147. package/dist/customer-portal-YL2YMPZL.js +7 -0
  148. package/dist/{customer-portal-runtime-PSM55KGU.js → customer-portal-runtime-N4NWQ67M.js} +1 -1
  149. package/dist/{customer-portal-runtime-DULJLR7F.cjs → customer-portal-runtime-OEXTSMSE.cjs} +2 -2
  150. package/dist/{customer-portal.d-DyZ2n2dW.d.cts → customer-portal.d-ChSEioI5.d.cts} +394 -9
  151. package/dist/{customer-portal.d-DyZ2n2dW.d.ts → customer-portal.d-ChSEioI5.d.ts} +394 -9
  152. package/dist/entity-SS36LQO6.cjs +7 -0
  153. package/dist/entity-Z4YWKDVG.js +7 -0
  154. package/dist/{entity.d-BHR9dEon.d.cts → entity.d-fospShiN.d.cts} +234 -169
  155. package/dist/{entity.d-BHR9dEon.d.ts → entity.d-fospShiN.d.ts} +234 -169
  156. package/dist/index.cjs +18 -18
  157. package/dist/index.d.cts +7 -7
  158. package/dist/index.d.ts +7 -7
  159. package/dist/index.js +6 -6
  160. package/dist/integration-toolkit-3I3IPVFN.cjs +7 -0
  161. package/dist/integration-toolkit-XAFQXNQY.js +7 -0
  162. package/dist/{integration-toolkit-runtime-5KG3LGXF.cjs → integration-toolkit-runtime-YHTU4X5J.cjs} +2 -2
  163. package/dist/{integration-toolkit-runtime-LYHFVIRW.js → integration-toolkit-runtime-YR4CIMKH.js} +1 -1
  164. package/dist/{integration-toolkit.d-Ry-KC9ow.d.cts → integration-toolkit.d-BstNqiJb.d.cts} +460 -20
  165. package/dist/{integration-toolkit.d-Ry-KC9ow.d.ts → integration-toolkit.d-BstNqiJb.d.ts} +460 -20
  166. package/dist/{js-yaml-UPZKYVRY.js → js-yaml-DLCVPJ7G.js} +17 -15
  167. package/dist/metering-3IUSYAGN.js +7 -0
  168. package/dist/metering-MHBFU7QH.cjs +7 -0
  169. package/dist/{webhooks-runtime-EBM4M3SU.cjs → metering-runtime-IUZJHBVS.cjs} +2 -2
  170. package/dist/{metering-runtime-NJ6NEUMB.js → metering-runtime-KZMJKKUZ.js} +1 -1
  171. package/dist/{metering.d-DvtPv7wk.d.ts → metering.d-CUICZDiL.d.cts} +718 -130
  172. package/dist/{metering.d-DvtPv7wk.d.cts → metering.d-CUICZDiL.d.ts} +718 -130
  173. package/dist/notes-K2IIFCX3.cjs +7 -0
  174. package/dist/notes-Q7JGS7O3.js +7 -0
  175. package/dist/{notes.d-BC-scR42.d.cts → notes.d-BcV_m5fe.d.cts} +33 -11
  176. package/dist/{notes.d-BC-scR42.d.ts → notes.d-BcV_m5fe.d.ts} +33 -11
  177. package/dist/{pricing-XAET4G7T.cjs → pricing-FODHQFCB.cjs} +1 -1
  178. package/dist/{pricing-G67CH3XH.js → pricing-XRIDVZFC.js} +1 -1
  179. package/dist/webhooks-NZ3TM3AY.cjs +7 -0
  180. package/dist/webhooks-XLBUXXCS.js +7 -0
  181. package/dist/{metering-runtime-HAIWXZXJ.cjs → webhooks-runtime-QVAFNBDW.cjs} +2 -2
  182. package/dist/{webhooks-runtime-XCQYIGQK.js → webhooks-runtime-UYTPQQVG.js} +1 -1
  183. package/dist/{webhooks.d-pLHIL_io.d.cts → webhooks.d-D79qib9f.d.cts} +115 -5
  184. package/dist/{webhooks.d-pLHIL_io.d.ts → webhooks.d-D79qib9f.d.ts} +115 -5
  185. package/docs/app.md +244 -9
  186. package/docs/customer-portal.md +340 -113
  187. package/docs/entity.md +65 -0
  188. package/docs/integration-toolkit.md +334 -19
  189. package/docs/metering.md +570 -48
  190. package/docs/notes.md +19 -12
  191. package/docs/pricing.md +3 -1
  192. package/docs/webhooks.md +49 -0
  193. package/package.json +1 -1
  194. package/dist/app-5KSVSKDU.js +0 -7
  195. package/dist/app-PL3IOROO.cjs +0 -7
  196. package/dist/app-runtime-SSNHSBR7.cjs +0 -5
  197. package/dist/chunk-265TE2OV.js +0 -14
  198. package/dist/chunk-2MMSXUOL.cjs +0 -14
  199. package/dist/chunk-4ZMLRFDX.cjs +0 -14
  200. package/dist/chunk-A7AAVJGM.js +0 -14
  201. package/dist/chunk-GVNT76UU.js +0 -14
  202. package/dist/chunk-HHMXS5NC.cjs +0 -14
  203. package/dist/chunk-U4PUHKZC.js +0 -14
  204. package/dist/customer-portal-5LMHNBMD.cjs +0 -7
  205. package/dist/customer-portal-RZACUF4N.js +0 -7
  206. package/dist/entity-H6ESUH3Y.js +0 -7
  207. package/dist/entity-ZVDKWQSF.cjs +0 -7
  208. package/dist/integration-toolkit-FRPFOYT2.js +0 -7
  209. package/dist/integration-toolkit-VNMDI55O.cjs +0 -7
  210. package/dist/metering-DZNZPPY6.cjs +0 -7
  211. package/dist/metering-KOSCPPKB.js +0 -7
  212. package/dist/notes-3AO5GXIT.js +0 -7
  213. package/dist/notes-MPWOQC5J.cjs +0 -7
  214. package/dist/webhooks-H3RT33BF.cjs +0 -7
  215. package/dist/webhooks-RTOU3MS5.js +0 -7
package/docs/metering.md CHANGED
@@ -1,6 +1,5 @@
1
1
  # Metering API
2
2
 
3
- - **Base URL:** `https://metering.sls.epilot.io`
4
3
  - **Full API Docs:** [https://docs.epilot.io/api/metering](https://docs.epilot.io/api/metering)
5
4
 
6
5
  ## Usage
@@ -44,6 +43,12 @@ const { data } = await meteringClient.getCustomerMeters(...)
44
43
  - [`updateMeterReading`](#updatemeterreading)
45
44
  - [`deleteMeterReading`](#deletemeterreading)
46
45
 
46
+ **Metering**
47
+ - [`getReadingChangesets`](#getreadingchangesets)
48
+ - [`applyReadingChangeset`](#applyreadingchangeset)
49
+ - [`dismissReadingChangeset`](#dismissreadingchangeset)
50
+ - [`updateReadingChangeset`](#updatereadingchangeset)
51
+
47
52
  **Schemas**
48
53
  - [`ErrorResp`](#errorresp)
49
54
  - [`EntityId`](#entityid)
@@ -63,6 +68,10 @@ const { data } = await meteringClient.getCustomerMeters(...)
63
68
  - [`Reading`](#reading)
64
69
  - [`MeterReading`](#meterreading)
65
70
  - [`PortalMeterReading`](#portalmeterreading)
71
+ - [`BatchReadingBase`](#batchreadingbase)
72
+ - [`CreateOrUpdateBatchReading`](#createorupdatebatchreading)
73
+ - [`DeleteBatchReading`](#deletebatchreading)
74
+ - [`BatchReading`](#batchreading)
66
75
  - [`UpdateMeterReading`](#updatemeterreading)
67
76
  - [`MeterCounter`](#metercounter)
68
77
  - [`CounterReadingOnSubmission`](#counterreadingonsubmission)
@@ -73,16 +82,23 @@ const { data } = await meteringClient.getCustomerMeters(...)
73
82
  - [`Rule`](#rule)
74
83
  - [`JourneyActions`](#journeyactions)
75
84
  - [`ReadingWithMeter`](#readingwithmeter)
85
+ - [`MeterReadingChangeset`](#meterreadingchangeset)
86
+ - [`FuzzyConfig`](#fuzzyconfig)
87
+ - [`ProposedReading`](#proposedreading)
88
+ - [`ChangesetCreator`](#changesetcreator)
89
+ - [`TimestampTolerance`](#timestamptolerance)
76
90
  - [`ActivityId`](#activityid)
77
91
 
78
92
  ### `getCustomerMeters`
79
93
 
80
- Get Customer Meters
94
+ Retrieves all meters associated with the authenticated portal customer.
81
95
 
82
96
  `GET /v1/metering/meter`
83
97
 
84
98
  ```ts
85
- const { data } = await client.getCustomerMeters()
99
+ const { data } = await client.getCustomerMeters({
100
+ include_pending_changesets: true,
101
+ })
86
102
  ```
87
103
 
88
104
  <details>
@@ -118,7 +134,7 @@ const { data } = await client.getCustomerMeters()
118
134
  ],
119
135
  "used_for": "Domestic Usage",
120
136
  "manufacturer": "Energy One",
121
- "calibration_date": "2022-10-10T00:00:00.000Z",
137
+ "calibration_date": "2022-10-10",
122
138
  "contract": {
123
139
  "$relation": [
124
140
  {
@@ -150,7 +166,7 @@ const { data } = await client.getCustomerMeters()
150
166
  }
151
167
  ]
152
168
  },
153
- "last_reading": "2022-10-10T00:00:00.000Z",
169
+ "last_reading": "2022-10-10",
154
170
  "current_consumption": 100.5
155
171
  }
156
172
  ]
@@ -163,7 +179,7 @@ const { data } = await client.getCustomerMeters()
163
179
 
164
180
  ### `getMetersByContractId`
165
181
 
166
- Retrieves all meters related to a contract.
182
+ Retrieves all meters associated with a given contract entity.
167
183
 
168
184
  `GET /v1/metering/contract/meters/{contract_id}`
169
185
 
@@ -206,7 +222,7 @@ const { data } = await client.getMetersByContractId({
206
222
  ],
207
223
  "used_for": "Domestic Usage",
208
224
  "manufacturer": "Energy One",
209
- "calibration_date": "2022-10-10T00:00:00.000Z",
225
+ "calibration_date": "2022-10-10",
210
226
  "contract": {
211
227
  "$relation": [
212
228
  {
@@ -234,7 +250,7 @@ const { data } = await client.getMetersByContractId({
234
250
 
235
251
  ### `updateMeter`
236
252
 
237
- Update Meter
253
+ Partially updates the details of a meter entity by ID.
238
254
 
239
255
  `PATCH /v1/metering/meter/{id}`
240
256
 
@@ -279,7 +295,7 @@ const { data } = await client.updateMeter(
279
295
  ],
280
296
  "used_for": "Domestic Usage",
281
297
  "manufacturer": "Energy One",
282
- "calibration_date": "2022-10-10T00:00:00.000Z",
298
+ "calibration_date": "2022-10-10",
283
299
  "contract": {
284
300
  "$relation": [
285
301
  {
@@ -306,7 +322,7 @@ const { data } = await client.updateMeter(
306
322
 
307
323
  ### `getMeter`
308
324
 
309
- Get Meter
325
+ Retrieves the full details of a specific meter by ID, including related entities and available journey actions.
310
326
 
311
327
  `GET /v1/metering/meter/{id}`
312
328
 
@@ -349,7 +365,7 @@ const { data } = await client.getMeter({
349
365
  ],
350
366
  "used_for": "Domestic Usage",
351
367
  "manufacturer": "Energy One",
352
- "calibration_date": "2022-10-10T00:00:00.000Z",
368
+ "calibration_date": "2022-10-10",
353
369
  "contract": {
354
370
  "$relation": [
355
371
  {
@@ -402,7 +418,7 @@ const { data } = await client.getMeter({
402
418
 
403
419
  ### `getMeterCounters`
404
420
 
405
- Get Meter Counters
421
+ Retrieves all meter counters associated with a given meter.
406
422
 
407
423
  `GET /v1/metering/counter`
408
424
 
@@ -431,9 +447,9 @@ const { data } = await client.getMeterCounters({
431
447
  "transformer_ratio": 70,
432
448
  "unit": "string",
433
449
  "forecast_reading_value": 270,
434
- "forecast_as_of": "2022-12-10T00:00:00.000Z",
450
+ "forecast_as_of": "2022-12-10",
435
451
  "current_consumption": 240,
436
- "last_reading": "2022-10-10T00:00:00.000Z",
452
+ "last_reading": "2022-10-10",
437
453
  "conversion_factor": 3,
438
454
  "tariff_type": "ht"
439
455
  }
@@ -447,7 +463,7 @@ const { data } = await client.getMeterCounters({
447
463
 
448
464
  ### `getCounterDetails`
449
465
 
450
- Get Counter Details
466
+ Retrieves the full details of a single meter counter by its ID.
451
467
 
452
468
  `GET /v1/metering/counter/{counter_id}`
453
469
 
@@ -475,9 +491,9 @@ const { data } = await client.getCounterDetails({
475
491
  "transformer_ratio": 70,
476
492
  "unit": "string",
477
493
  "forecast_reading_value": 270,
478
- "forecast_as_of": "2022-12-10T00:00:00.000Z",
494
+ "forecast_as_of": "2022-12-10",
479
495
  "current_consumption": 240,
480
- "last_reading": "2022-10-10T00:00:00.000Z",
496
+ "last_reading": "2022-10-10",
481
497
  "conversion_factor": 3,
482
498
  "tariff_type": "ht"
483
499
  }
@@ -490,13 +506,15 @@ const { data } = await client.getCounterDetails({
490
506
 
491
507
  ### `createMeterReading`
492
508
 
493
- Create Meter Reading
509
+ Inserts a new meter reading.
494
510
 
495
511
  `POST /v1/metering/reading`
496
512
 
497
513
  ```ts
498
514
  const { data } = await client.createMeterReading(
499
- null,
515
+ {
516
+ direct: true,
517
+ },
500
518
  {
501
519
  value: 240,
502
520
  read_by: 'John Doe',
@@ -504,7 +522,7 @@ const { data } = await client.createMeterReading(
504
522
  meter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
505
523
  counter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
506
524
  direction: 'feed-in',
507
- timestamp: '2022-10-10T00:00:00.000Z',
525
+ timestamp: '2022-10-10',
508
526
  source: 'ECP',
509
527
  status: 'valid',
510
528
  external_id: 'string',
@@ -531,7 +549,7 @@ const { data } = await client.createMeterReading(
531
549
  "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
532
550
  "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
533
551
  "direction": "feed-in",
534
- "timestamp": "2022-10-10T00:00:00.000Z",
552
+ "timestamp": "2022-10-10",
535
553
  "source": "ECP",
536
554
  "status": "valid",
537
555
  "external_id": "string",
@@ -552,7 +570,7 @@ const { data } = await client.createMeterReading(
552
570
 
553
571
  ### `createMeterReadings`
554
572
 
555
- Create Meter Readings
573
+ Inserts multiple meter readings at once. Limited to 100 readings per request.
556
574
 
557
575
  `POST /v1/metering/readings`
558
576
 
@@ -562,6 +580,7 @@ const { data } = await client.createMeterReadings(
562
580
  async: true,
563
581
  activity_id: 'example',
564
582
  skip_validation: true,
583
+ direct: true,
565
584
  },
566
585
  {
567
586
  readings: [
@@ -572,7 +591,7 @@ const { data } = await client.createMeterReadings(
572
591
  meter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
573
592
  counter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
574
593
  direction: 'feed-in',
575
- timestamp: '2022-10-10T00:00:00.000Z',
594
+ timestamp: '2022-10-10',
576
595
  source: 'ECP',
577
596
  status: 'valid',
578
597
  external_id: 'string',
@@ -602,7 +621,7 @@ const { data } = await client.createMeterReadings(
602
621
  "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
603
622
  "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
604
623
  "direction": "feed-in",
605
- "timestamp": "2022-10-10T00:00:00.000Z",
624
+ "timestamp": "2022-10-10",
606
625
  "source": "ECP",
607
626
  "status": "valid",
608
627
  "external_id": "string",
@@ -624,7 +643,8 @@ const { data } = await client.createMeterReadings(
624
643
 
625
644
  ### `createPortalMeterReadings`
626
645
 
627
- Inserts multiple meter readings at once for a given meter. Limited to 2 readings per request.
646
+ Inserts multiple meter readings at once for a given meter via the end customer portal.
647
+ Limited to 100 readings per request.
628
648
 
629
649
  `POST /v1/metering/readings/{meter_id}`
630
650
 
@@ -632,6 +652,7 @@ Inserts multiple meter readings at once for a given meter. Limited to 2 readings
632
652
  const { data } = await client.createPortalMeterReadings(
633
653
  {
634
654
  meter_id: 'example',
655
+ direct: true,
635
656
  },
636
657
  {
637
658
  readings: [
@@ -642,7 +663,7 @@ const { data } = await client.createPortalMeterReadings(
642
663
  meter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
643
664
  counter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
644
665
  direction: 'feed-in',
645
- timestamp: '2022-10-10T00:00:00.000Z',
666
+ timestamp: '2022-10-10',
646
667
  source: 'ECP',
647
668
  status: 'valid',
648
669
  external_id: 'string',
@@ -672,7 +693,7 @@ const { data } = await client.createPortalMeterReadings(
672
693
  "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
673
694
  "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
674
695
  "direction": "feed-in",
675
- "timestamp": "2022-10-10T00:00:00.000Z",
696
+ "timestamp": "2022-10-10",
676
697
  "source": "ECP",
677
698
  "status": "valid",
678
699
  "external_id": "string",
@@ -694,7 +715,7 @@ const { data } = await client.createPortalMeterReadings(
694
715
 
695
716
  ### `batchWriteMeterReadings`
696
717
 
697
- Batch Write Readings
718
+ Upserts or deletes multiple meter readings at once. Limited to 100 readings per request.
698
719
 
699
720
  `POST /v2/metering/readings`
700
721
 
@@ -704,29 +725,30 @@ const { data } = await client.batchWriteMeterReadings(
704
725
  async: true,
705
726
  skip_validation: true,
706
727
  activity_id: 'example',
728
+ direct: true,
707
729
  },
708
730
  {
709
731
  identifiers: ['string'],
710
732
  readings: [
711
733
  {
712
- value: 240,
713
- read_by: 'John Doe',
714
- reason: '',
715
734
  meter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
716
735
  counter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
717
736
  direction: 'feed-in',
718
- timestamp: '2022-10-10T00:00:00.000Z',
719
- source: 'ECP',
720
- status: 'valid',
737
+ timestamp: '2022-10-10T10:00:00Z',
721
738
  external_id: 'string',
722
- remark: 'Customer reported unusual consumption',
723
739
  metadata: {
724
740
  registration_id: '1234567890',
725
741
  business_unit: 'ABC'
726
742
  },
743
+ operation: 'create',
744
+ value: 240,
745
+ source: 'ECP',
746
+ read_by: 'John Doe',
747
+ reason: '',
748
+ status: 'valid',
749
+ remark: 'Customer reported unusual consumption',
727
750
  note: 'string',
728
- unit: 'string',
729
- operation: 'create'
751
+ unit: 'string'
730
752
  }
731
753
  ]
732
754
  },
@@ -746,7 +768,7 @@ const { data } = await client.batchWriteMeterReadings(
746
768
  "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
747
769
  "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
748
770
  "direction": "feed-in",
749
- "timestamp": "2022-10-10T00:00:00.000Z",
771
+ "timestamp": "2022-10-10",
750
772
  "source": "ECP",
751
773
  "status": "valid",
752
774
  "external_id": "string",
@@ -768,7 +790,7 @@ const { data } = await client.batchWriteMeterReadings(
768
790
 
769
791
  ### `createMeterReadingFromSubmission`
770
792
 
771
- Create Meter Reading from Submission
793
+ Creates meter readings from a journey submission payload.
772
794
 
773
795
  `POST /v1/metering/reading/submission`
774
796
 
@@ -824,7 +846,7 @@ const { data } = await client.createMeterReadingFromSubmission(
824
846
 
825
847
  ### `getAllowedReadingForMeter`
826
848
 
827
- Get allowed reading for the given meter
849
+ Returns the allowed min/max reading range for each counter of the given meter.
828
850
 
829
851
  `GET /v1/metering/allowed/reading/{meter_id}`
830
852
 
@@ -856,7 +878,7 @@ const { data } = await client.getAllowedReadingForMeter({
856
878
 
857
879
  ### `createReadingWithMeter`
858
880
 
859
- Create Reading with Meter
881
+ Creates a meter reading along with meter lookup or creation by MA-LO ID and OBIS number.
860
882
 
861
883
  `POST /v1/metering/reading/with-meter`
862
884
 
@@ -891,7 +913,7 @@ const { data } = await client.createReadingWithMeter(
891
913
  "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
892
914
  "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
893
915
  "direction": "feed-in",
894
- "timestamp": "2022-10-10T00:00:00.000Z",
916
+ "timestamp": "2022-10-10",
895
917
  "source": "ECP",
896
918
  "status": "valid",
897
919
  "external_id": "string",
@@ -912,7 +934,9 @@ const { data } = await client.createReadingWithMeter(
912
934
 
913
935
  ### `getReadingsByInterval`
914
936
 
915
- Get Readings by Interval
937
+ Retrieves all readings specified in an interval.
938
+ If the start_date and end_date are equal, then it returns the readings of the specified date.
939
+ The start_date should be less than or equal to the end_da
916
940
 
917
941
  `GET /v1/metering/reading/{meter_id}/{counter_id}`
918
942
 
@@ -927,6 +951,7 @@ const { data } = await client.getReadingsByInterval({
927
951
  from: 1,
928
952
  type: 'example',
929
953
  sort: 'example',
954
+ include_pending_changesets: true,
930
955
  })
931
956
  ```
932
957
 
@@ -943,7 +968,7 @@ const { data } = await client.getReadingsByInterval({
943
968
  "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
944
969
  "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
945
970
  "direction": "feed-in",
946
- "timestamp": "2022-10-10T00:00:00.000Z",
971
+ "timestamp": "2022-10-10",
947
972
  "source": "ECP",
948
973
  "status": "valid",
949
974
  "external_id": "string",
@@ -967,7 +992,7 @@ const { data } = await client.getReadingsByInterval({
967
992
 
968
993
  ### `updateMeterReading`
969
994
 
970
- Update Meter Reading
995
+ Updates an existing meter reading identified by meter ID, counter ID, and timestamp.
971
996
 
972
997
  `PUT /v1/metering/reading/{meter_id}/{counter_id}`
973
998
 
@@ -985,7 +1010,7 @@ const { data } = await client.updateMeterReading(
985
1010
  meter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
986
1011
  counter_id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
987
1012
  direction: 'feed-in',
988
- timestamp: '2022-10-10T00:00:00.000Z',
1013
+ timestamp: '2022-10-10',
989
1014
  source: 'ECP',
990
1015
  status: 'valid',
991
1016
  external_id: 'string',
@@ -1010,7 +1035,7 @@ const { data } = await client.updateMeterReading(
1010
1035
  "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1011
1036
  "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1012
1037
  "direction": "feed-in",
1013
- "timestamp": "2022-10-10T00:00:00.000Z",
1038
+ "timestamp": "2022-10-10",
1014
1039
  "source": "ECP",
1015
1040
  "status": "valid",
1016
1041
  "external_id": "string",
@@ -1031,7 +1056,7 @@ const { data } = await client.updateMeterReading(
1031
1056
 
1032
1057
  ### `deleteMeterReading`
1033
1058
 
1034
- Delete Meter Reading
1059
+ Permanently deletes a meter reading identified by meter ID, counter ID, and timestamp.
1035
1060
 
1036
1061
  `DELETE /v1/metering/reading/{meter_id}/{counter_id}`
1037
1062
 
@@ -1060,6 +1085,305 @@ const { data } = await client.deleteMeterReading({
1060
1085
 
1061
1086
  ---
1062
1087
 
1088
+ ### `getReadingChangesets`
1089
+
1090
+ List pending reading changesets for a counter
1091
+
1092
+ `GET /v1/metering/reading/{meter_id}/{counter_id}/changesets`
1093
+
1094
+ ```ts
1095
+ const { data } = await client.getReadingChangesets({
1096
+ meter_id: 'example',
1097
+ counter_id: 'example',
1098
+ })
1099
+ ```
1100
+
1101
+ <details>
1102
+ <summary>Response</summary>
1103
+
1104
+ ```json
1105
+ {
1106
+ "changesets": [
1107
+ {
1108
+ "changeset_id": "string",
1109
+ "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1110
+ "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1111
+ "proposed": {
1112
+ "value": 0,
1113
+ "direction": "feed-in",
1114
+ "timestamp": "1970-01-01T00:00:00.000Z",
1115
+ "reason": "string",
1116
+ "remark": "string",
1117
+ "read_by": "string",
1118
+ "status": "valid",
1119
+ "external_id": "string"
1120
+ },
1121
+ "previous": {
1122
+ "value": 0,
1123
+ "direction": "feed-in",
1124
+ "timestamp": "1970-01-01T00:00:00.000Z",
1125
+ "reason": "string",
1126
+ "remark": "string",
1127
+ "read_by": "string",
1128
+ "status": "valid",
1129
+ "external_id": "string"
1130
+ },
1131
+ "edit_mode": "external",
1132
+ "match_strategy": "exact",
1133
+ "timestamp_tolerance": "exact",
1134
+ "created_at": "1970-01-01T00:00:00.000Z",
1135
+ "created_by": {
1136
+ "type": "user",
1137
+ "id": "string"
1138
+ },
1139
+ "source": "360",
1140
+ "fuzzy_config": {
1141
+ "percentage_threshold": 0.01,
1142
+ "absolute_threshold": 0
1143
+ },
1144
+ "dismissed_reason": "string",
1145
+ "dismissed_at": "1970-01-01T00:00:00.000Z"
1146
+ }
1147
+ ]
1148
+ }
1149
+ ```
1150
+
1151
+ </details>
1152
+
1153
+ ---
1154
+
1155
+ ### `applyReadingChangeset`
1156
+
1157
+ Apply (approve) a pending reading changeset
1158
+
1159
+ `POST /v1/metering/reading/{meter_id}/{counter_id}/changesets/{changeset_id}:apply`
1160
+
1161
+ ```ts
1162
+ const { data } = await client.applyReadingChangeset({
1163
+ meter_id: 'example',
1164
+ counter_id: 'example',
1165
+ changeset_id: 'example',
1166
+ })
1167
+ ```
1168
+
1169
+ <details>
1170
+ <summary>Response</summary>
1171
+
1172
+ ```json
1173
+ {
1174
+ "reading": {
1175
+ "value": 240,
1176
+ "read_by": "John Doe",
1177
+ "reason": "",
1178
+ "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1179
+ "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1180
+ "direction": "feed-in",
1181
+ "timestamp": "2022-10-10",
1182
+ "source": "ECP",
1183
+ "status": "valid",
1184
+ "external_id": "string",
1185
+ "remark": "Customer reported unusual consumption",
1186
+ "metadata": {
1187
+ "registration_id": "1234567890",
1188
+ "business_unit": "ABC"
1189
+ },
1190
+ "note": "string",
1191
+ "unit": "string"
1192
+ },
1193
+ "changeset": {
1194
+ "changeset_id": "string",
1195
+ "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1196
+ "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1197
+ "proposed": {
1198
+ "value": 0,
1199
+ "direction": "feed-in",
1200
+ "timestamp": "1970-01-01T00:00:00.000Z",
1201
+ "reason": "string",
1202
+ "remark": "string",
1203
+ "read_by": "string",
1204
+ "status": "valid",
1205
+ "external_id": "string"
1206
+ },
1207
+ "previous": {
1208
+ "value": 0,
1209
+ "direction": "feed-in",
1210
+ "timestamp": "1970-01-01T00:00:00.000Z",
1211
+ "reason": "string",
1212
+ "remark": "string",
1213
+ "read_by": "string",
1214
+ "status": "valid",
1215
+ "external_id": "string"
1216
+ },
1217
+ "edit_mode": "external",
1218
+ "match_strategy": "exact",
1219
+ "timestamp_tolerance": "exact",
1220
+ "created_at": "1970-01-01T00:00:00.000Z",
1221
+ "created_by": {
1222
+ "type": "user",
1223
+ "id": "string"
1224
+ },
1225
+ "source": "360",
1226
+ "fuzzy_config": {
1227
+ "percentage_threshold": 0.01,
1228
+ "absolute_threshold": 0
1229
+ },
1230
+ "dismissed_reason": "string",
1231
+ "dismissed_at": "1970-01-01T00:00:00.000Z"
1232
+ }
1233
+ }
1234
+ ```
1235
+
1236
+ </details>
1237
+
1238
+ ---
1239
+
1240
+ ### `dismissReadingChangeset`
1241
+
1242
+ Dismiss (reject) a pending reading changeset
1243
+
1244
+ `POST /v1/metering/reading/{meter_id}/{counter_id}/changesets/{changeset_id}:dismiss`
1245
+
1246
+ ```ts
1247
+ const { data } = await client.dismissReadingChangeset(
1248
+ {
1249
+ meter_id: 'example',
1250
+ counter_id: 'example',
1251
+ changeset_id: 'example',
1252
+ },
1253
+ {
1254
+ reason: 'string'
1255
+ },
1256
+ )
1257
+ ```
1258
+
1259
+ <details>
1260
+ <summary>Response</summary>
1261
+
1262
+ ```json
1263
+ {
1264
+ "changeset_id": "string",
1265
+ "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1266
+ "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1267
+ "proposed": {
1268
+ "value": 0,
1269
+ "direction": "feed-in",
1270
+ "timestamp": "1970-01-01T00:00:00.000Z",
1271
+ "reason": "string",
1272
+ "remark": "string",
1273
+ "read_by": "string",
1274
+ "status": "valid",
1275
+ "external_id": "string"
1276
+ },
1277
+ "previous": {
1278
+ "value": 0,
1279
+ "direction": "feed-in",
1280
+ "timestamp": "1970-01-01T00:00:00.000Z",
1281
+ "reason": "string",
1282
+ "remark": "string",
1283
+ "read_by": "string",
1284
+ "status": "valid",
1285
+ "external_id": "string"
1286
+ },
1287
+ "edit_mode": "external",
1288
+ "match_strategy": "exact",
1289
+ "timestamp_tolerance": "exact",
1290
+ "created_at": "1970-01-01T00:00:00.000Z",
1291
+ "created_by": {
1292
+ "type": "user",
1293
+ "id": "string"
1294
+ },
1295
+ "source": "360",
1296
+ "fuzzy_config": {
1297
+ "percentage_threshold": 0.01,
1298
+ "absolute_threshold": 0
1299
+ },
1300
+ "dismissed_reason": "string",
1301
+ "dismissed_at": "1970-01-01T00:00:00.000Z"
1302
+ }
1303
+ ```
1304
+
1305
+ </details>
1306
+
1307
+ ---
1308
+
1309
+ ### `updateReadingChangeset`
1310
+
1311
+ Edit a pending reading changeset
1312
+
1313
+ `PATCH /v1/metering/reading/{meter_id}/{counter_id}/changesets/{changeset_id}`
1314
+
1315
+ ```ts
1316
+ const { data } = await client.updateReadingChangeset(
1317
+ {
1318
+ meter_id: 'example',
1319
+ counter_id: 'example',
1320
+ changeset_id: 'example',
1321
+ },
1322
+ {
1323
+ proposed: {
1324
+ value: 0,
1325
+ direction: 'feed-in',
1326
+ timestamp: '1970-01-01T00:00:00.000Z',
1327
+ reason: 'string',
1328
+ remark: 'string',
1329
+ read_by: 'string',
1330
+ status: 'valid',
1331
+ external_id: 'string'
1332
+ }
1333
+ },
1334
+ )
1335
+ ```
1336
+
1337
+ <details>
1338
+ <summary>Response</summary>
1339
+
1340
+ ```json
1341
+ {
1342
+ "changeset_id": "string",
1343
+ "meter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1344
+ "counter_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1345
+ "proposed": {
1346
+ "value": 0,
1347
+ "direction": "feed-in",
1348
+ "timestamp": "1970-01-01T00:00:00.000Z",
1349
+ "reason": "string",
1350
+ "remark": "string",
1351
+ "read_by": "string",
1352
+ "status": "valid",
1353
+ "external_id": "string"
1354
+ },
1355
+ "previous": {
1356
+ "value": 0,
1357
+ "direction": "feed-in",
1358
+ "timestamp": "1970-01-01T00:00:00.000Z",
1359
+ "reason": "string",
1360
+ "remark": "string",
1361
+ "read_by": "string",
1362
+ "status": "valid",
1363
+ "external_id": "string"
1364
+ },
1365
+ "edit_mode": "external",
1366
+ "match_strategy": "exact",
1367
+ "timestamp_tolerance": "exact",
1368
+ "created_at": "1970-01-01T00:00:00.000Z",
1369
+ "created_by": {
1370
+ "type": "user",
1371
+ "id": "string"
1372
+ },
1373
+ "source": "360",
1374
+ "fuzzy_config": {
1375
+ "percentage_threshold": 0.01,
1376
+ "absolute_threshold": 0
1377
+ },
1378
+ "dismissed_reason": "string",
1379
+ "dismissed_at": "1970-01-01T00:00:00.000Z"
1380
+ }
1381
+ ```
1382
+
1383
+ </details>
1384
+
1385
+ ---
1386
+
1063
1387
  ## Schemas
1064
1388
 
1065
1389
  ### `ErrorResp`
@@ -1275,6 +1599,96 @@ type PortalMeterReading = {
1275
1599
  }
1276
1600
  ```
1277
1601
 
1602
+ ### `BatchReadingBase`
1603
+
1604
+ Base properties shared by all batch reading operations
1605
+
1606
+ ```ts
1607
+ type BatchReadingBase = {
1608
+ meter_id?: string // uuid
1609
+ counter_id?: string // uuid
1610
+ direction?: "feed-in" | "feed-out"
1611
+ timestamp?: string // date-time
1612
+ external_id?: string
1613
+ metadata?: Record<string, string>
1614
+ }
1615
+ ```
1616
+
1617
+ ### `CreateOrUpdateBatchReading`
1618
+
1619
+ Schema for create or update operations - requires value, source, and meter_id
1620
+
1621
+ ```ts
1622
+ type CreateOrUpdateBatchReading = {
1623
+ meter_id: string // uuid
1624
+ counter_id?: string // uuid
1625
+ direction?: "feed-in" | "feed-out"
1626
+ timestamp?: string // date-time
1627
+ external_id?: string
1628
+ metadata?: Record<string, string>
1629
+ operation?: "create" | "update"
1630
+ value: number
1631
+ source: "ECP" | "ERP" | "360" | "journey-submission"
1632
+ read_by?: string
1633
+ reason?: "" | "regular" | "irregular" | "last" | "first" | "meter_change" | "contract_change" | "meter_adjustment"
1634
+ status?: "valid" | "in-validation" | "implausible" | null | ""
1635
+ remark?: string
1636
+ note?: string
1637
+ unit?: string
1638
+ }
1639
+ ```
1640
+
1641
+ ### `DeleteBatchReading`
1642
+
1643
+ Schema for delete operations - only requires identifier fields specified in the identifiers parameter
1644
+
1645
+ ```ts
1646
+ type DeleteBatchReading = {
1647
+ meter_id?: string // uuid
1648
+ counter_id?: string // uuid
1649
+ direction?: "feed-in" | "feed-out"
1650
+ timestamp?: string // date-time
1651
+ external_id?: string
1652
+ metadata?: Record<string, string>
1653
+ operation: "delete"
1654
+ }
1655
+ ```
1656
+
1657
+ ### `BatchReading`
1658
+
1659
+ A meter reading for batch operations. The required fields depend on the operation:
1660
+ - create/update: requires value, source, and meter_id
1661
+ - delete: only requires the fields specified in the identifiers parameter
1662
+
1663
+
1664
+ ```ts
1665
+ type BatchReading = {
1666
+ meter_id: string // uuid
1667
+ counter_id?: string // uuid
1668
+ direction?: "feed-in" | "feed-out"
1669
+ timestamp?: string // date-time
1670
+ external_id?: string
1671
+ metadata?: Record<string, string>
1672
+ operation?: "create" | "update"
1673
+ value: number
1674
+ source: "ECP" | "ERP" | "360" | "journey-submission"
1675
+ read_by?: string
1676
+ reason?: "" | "regular" | "irregular" | "last" | "first" | "meter_change" | "contract_change" | "meter_adjustment"
1677
+ status?: "valid" | "in-validation" | "implausible" | null | ""
1678
+ remark?: string
1679
+ note?: string
1680
+ unit?: string
1681
+ } | {
1682
+ meter_id?: string // uuid
1683
+ counter_id?: string // uuid
1684
+ direction?: "feed-in" | "feed-out"
1685
+ timestamp?: string // date-time
1686
+ external_id?: string
1687
+ metadata?: Record<string, string>
1688
+ operation: "delete"
1689
+ }
1690
+ ```
1691
+
1278
1692
  ### `UpdateMeterReading`
1279
1693
 
1280
1694
  ```ts
@@ -1422,6 +1836,114 @@ type ReadingWithMeter = {
1422
1836
  }
1423
1837
  ```
1424
1838
 
1839
+ ### `MeterReadingChangeset`
1840
+
1841
+ ```ts
1842
+ type MeterReadingChangeset = {
1843
+ changeset_id: string
1844
+ meter_id?: string // uuid
1845
+ counter_id?: string // uuid
1846
+ proposed: {
1847
+ value: number
1848
+ direction?: "feed-in" | "feed-out"
1849
+ timestamp?: string // date-time
1850
+ reason?: string
1851
+ remark?: string
1852
+ read_by?: string
1853
+ status?: "valid" | "in-validation" | "implausible"
1854
+ external_id?: string
1855
+ }
1856
+ previous?: {
1857
+ value: number
1858
+ direction?: "feed-in" | "feed-out"
1859
+ timestamp?: string // date-time
1860
+ reason?: string
1861
+ remark?: string
1862
+ read_by?: string
1863
+ status?: "valid" | "in-validation" | "implausible"
1864
+ external_id?: string
1865
+ }
1866
+ edit_mode: "external" | "approval"
1867
+ match_strategy?: "exact" | "fuzzy"
1868
+ timestamp_tolerance?: "exact" | {
1869
+ type: "same-day"
1870
+ timezone?: string
1871
+ } | {
1872
+ type: "within-seconds"
1873
+ seconds: number
1874
+ }
1875
+ created_at: string // date-time
1876
+ created_by?: {
1877
+ type?: "user" | "portal_user" | "api_client" | "automation"
1878
+ id?: string
1879
+ }
1880
+ source?: "360" | "ECP" | "ERP" | "journey-submission"
1881
+ fuzzy_config?: {
1882
+ percentage_threshold?: number
1883
+ absolute_threshold?: number
1884
+ }
1885
+ dismissed_reason?: string
1886
+ dismissed_at?: string // date-time
1887
+ }
1888
+ ```
1889
+
1890
+ ### `FuzzyConfig`
1891
+
1892
+ Numeric-threshold fuzzy matching for meter reading auto-clear.
1893
+
1894
+ NOTE: This is intentionally different from entity-api's FuzzyConfig. Entity-api's
1895
+ fuzzy strategies (suffix, digits_only, normalize_phone, ignore_fields,
1896
+ contains_entry, regex) are designed for strings and structured objects (IBAN, phone
1897
+
1898
+ ```ts
1899
+ type FuzzyConfig = {
1900
+ percentage_threshold?: number
1901
+ absolute_threshold?: number
1902
+ }
1903
+ ```
1904
+
1905
+ ### `ProposedReading`
1906
+
1907
+ ```ts
1908
+ type ProposedReading = {
1909
+ value: number
1910
+ direction?: "feed-in" | "feed-out"
1911
+ timestamp?: string // date-time
1912
+ reason?: string
1913
+ remark?: string
1914
+ read_by?: string
1915
+ status?: "valid" | "in-validation" | "implausible"
1916
+ external_id?: string
1917
+ }
1918
+ ```
1919
+
1920
+ ### `ChangesetCreator`
1921
+
1922
+ ```ts
1923
+ type ChangesetCreator = {
1924
+ type?: "user" | "portal_user" | "api_client" | "automation"
1925
+ id?: string
1926
+ }
1927
+ ```
1928
+
1929
+ ### `TimestampTolerance`
1930
+
1931
+ Slack on `reading.timestamp` when auto-clear matches an incoming reading
1932
+ against a pending changeset. Both sides reference the SAME physical
1933
+ meter-read event — one as stored when the user submitted, the other as
1934
+ echoed back by the ERP. The tolerance accommodates round-trip format
1935
+ drift between the t
1936
+
1937
+ ```ts
1938
+ type TimestampTolerance = "exact" | {
1939
+ type: "same-day"
1940
+ timezone?: string
1941
+ } | {
1942
+ type: "within-seconds"
1943
+ seconds: number
1944
+ }
1945
+ ```
1946
+
1425
1947
  ### `ActivityId`
1426
1948
 
1427
1949
  See https://github.com/ulid/spec