@serviceai/api-spec 1.2.433 → 1.2.434

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 (4) hide show
  1. package/openapi.json +537 -127
  2. package/openapi.yaml +517 -120
  3. package/package.json +1 -1
  4. package/types.d.ts +281 -11
package/openapi.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: ServiceAi API
4
- version: 1.2.433
4
+ version: 1.2.434
5
5
  description: >-
6
6
  Source-of-truth API contract for ServiceAi. Generated from `shared/schema.ts` Zod schemas by
7
7
  `scripts/build-api-spec.ts`. Versioning policy: see `docs/api-versioning.md`. The hand-written docs/ios-contract.md
@@ -89,7 +89,7 @@ components:
89
89
  properties:
90
90
  apiVersion:
91
91
  type: string
92
- example: 1.2.433
92
+ example: 1.2.434
93
93
  minClientVersion:
94
94
  type: string
95
95
  example: 1.0.0
@@ -164,11 +164,11 @@ components:
164
164
  additionalProperties: {}
165
165
  - type: array
166
166
  items: {}
167
- - type: 'null'
168
167
  lastContactDate:
169
168
  type:
170
169
  - string
171
170
  - 'null'
171
+ format: date-time
172
172
  parentContactId:
173
173
  type:
174
174
  - integer
@@ -281,6 +281,7 @@ components:
281
281
  type:
282
282
  - string
283
283
  - 'null'
284
+ format: date-time
284
285
  qboLastPushedHash:
285
286
  type:
286
287
  - string
@@ -293,6 +294,7 @@ components:
293
294
  type:
294
295
  - string
295
296
  - 'null'
297
+ format: date-time
296
298
  deletedBy:
297
299
  type:
298
300
  - string
@@ -432,7 +434,6 @@ components:
432
434
  additionalProperties: {}
433
435
  - type: array
434
436
  items: {}
435
- - type: 'null'
436
437
  featureTier:
437
438
  type:
438
439
  - string
@@ -447,7 +448,6 @@ components:
447
448
  additionalProperties: {}
448
449
  - type: array
449
450
  items: {}
450
- - type: 'null'
451
451
  parentScanId:
452
452
  type:
453
453
  - integer
@@ -464,7 +464,6 @@ components:
464
464
  additionalProperties: {}
465
465
  - type: array
466
466
  items: {}
467
- - type: 'null'
468
467
  doorwayLinks:
469
468
  anyOf:
470
469
  - type: string
@@ -475,7 +474,6 @@ components:
475
474
  additionalProperties: {}
476
475
  - type: array
477
476
  items: {}
478
- - type: 'null'
479
477
  description: >-
480
478
  Persisted append-room doorway links on a composite scan. Each link carries both a `sourceOpeningKind` (the
481
479
  appended child scan's entry side — always `door` in practice, since iOS does not capture openings on a
@@ -493,7 +491,6 @@ components:
493
491
  additionalProperties: {}
494
492
  - type: array
495
493
  items: {}
496
- - type: 'null'
497
494
  cleanupPipelineVersion:
498
495
  type:
499
496
  - string
@@ -516,7 +513,6 @@ components:
516
513
  additionalProperties: {}
517
514
  - type: array
518
515
  items: {}
519
- - type: 'null'
520
516
  deviceTrack:
521
517
  anyOf:
522
518
  - type: string
@@ -527,15 +523,12 @@ components:
527
523
  additionalProperties: {}
528
524
  - type: array
529
525
  items: {}
530
- - type: 'null'
531
526
  referencePhotoKeys:
532
527
  type:
533
528
  - array
534
529
  - 'null'
535
530
  items:
536
- type:
537
- - string
538
- - 'null'
531
+ type: string
539
532
  metricCorrection:
540
533
  type:
541
534
  - number
@@ -566,6 +559,7 @@ components:
566
559
  type:
567
560
  - string
568
561
  - 'null'
562
+ format: date-time
569
563
  captureMode:
570
564
  type:
571
565
  - string
@@ -580,6 +574,12 @@ components:
580
574
  type:
581
575
  - string
582
576
  - 'null'
577
+ format: date-time
578
+ clientScanId:
579
+ type:
580
+ - string
581
+ - 'null'
582
+ maxLength: 64
583
583
  floorPlanAssetId:
584
584
  type:
585
585
  - string
@@ -614,6 +614,42 @@ components:
614
614
  - 'null'
615
615
  minimum: -2147483648
616
616
  maximum: 2147483647
617
+ sourceSketchId:
618
+ type:
619
+ - integer
620
+ - 'null'
621
+ minimum: -2147483648
622
+ maximum: 2147483647
623
+ takeoffPagePixelsPerMeter:
624
+ type:
625
+ - number
626
+ - 'null'
627
+ minimum: -140737488355328
628
+ maximum: 140737488355327
629
+ takeoffPageOffsetX:
630
+ type:
631
+ - number
632
+ - 'null'
633
+ minimum: -140737488355328
634
+ maximum: 140737488355327
635
+ takeoffPageOffsetY:
636
+ type:
637
+ - number
638
+ - 'null'
639
+ minimum: -140737488355328
640
+ maximum: 140737488355327
641
+ takeoffPageWidthPx:
642
+ type:
643
+ - integer
644
+ - 'null'
645
+ minimum: -2147483648
646
+ maximum: 2147483647
647
+ takeoffPageHeightPx:
648
+ type:
649
+ - integer
650
+ - 'null'
651
+ minimum: -2147483648
652
+ maximum: 2147483647
617
653
  floorId:
618
654
  type:
619
655
  - integer
@@ -632,6 +668,7 @@ components:
632
668
  type:
633
669
  - string
634
670
  - 'null'
671
+ format: date-time
635
672
  deletedBy:
636
673
  type:
637
674
  - string
@@ -687,10 +724,12 @@ components:
687
724
  type:
688
725
  - string
689
726
  - 'null'
727
+ format: date-time
690
728
  dueDate:
691
729
  type:
692
730
  - string
693
731
  - 'null'
732
+ format: date-time
694
733
  allDay:
695
734
  type:
696
735
  - boolean
@@ -713,7 +752,6 @@ components:
713
752
  additionalProperties: {}
714
753
  - type: array
715
754
  items: {}
716
- - type: 'null'
717
755
  assignedContactIds:
718
756
  anyOf:
719
757
  - type: string
@@ -724,7 +762,6 @@ components:
724
762
  additionalProperties: {}
725
763
  - type: array
726
764
  items: {}
727
- - type: 'null'
728
765
  isPersonal:
729
766
  type:
730
767
  - boolean
@@ -745,7 +782,6 @@ components:
745
782
  additionalProperties: {}
746
783
  - type: array
747
784
  items: {}
748
- - type: 'null'
749
785
  relatedFiles:
750
786
  anyOf:
751
787
  - type: string
@@ -756,7 +792,6 @@ components:
756
792
  additionalProperties: {}
757
793
  - type: array
758
794
  items: {}
759
- - type: 'null'
760
795
  reminder:
761
796
  type:
762
797
  - string
@@ -769,6 +804,7 @@ components:
769
804
  - 1_hour
770
805
  - 1_day
771
806
  - 1_week
807
+ - null
772
808
  reminderNotificationId:
773
809
  type:
774
810
  - integer
@@ -793,6 +829,7 @@ components:
793
829
  type:
794
830
  - string
795
831
  - 'null'
832
+ format: date-time
796
833
  parentTaskId:
797
834
  type:
798
835
  - integer
@@ -803,6 +840,7 @@ components:
803
840
  type:
804
841
  - string
805
842
  - 'null'
843
+ format: date-time
806
844
  isRecurrenceException:
807
845
  type:
808
846
  - boolean
@@ -817,7 +855,6 @@ components:
817
855
  additionalProperties: {}
818
856
  - type: array
819
857
  items: {}
820
- - type: 'null'
821
858
  displayIndex:
822
859
  type:
823
860
  - integer
@@ -828,6 +865,7 @@ components:
828
865
  type:
829
866
  - string
830
867
  - 'null'
868
+ format: date-time
831
869
  deletedBy:
832
870
  type:
833
871
  - string
@@ -865,6 +903,7 @@ components:
865
903
  type:
866
904
  - string
867
905
  - 'null'
906
+ format: date-time
868
907
  deletedBy:
869
908
  type:
870
909
  - string
@@ -916,15 +955,12 @@ components:
916
955
  additionalProperties: {}
917
956
  - type: array
918
957
  items: {}
919
- - type: 'null'
920
958
  tags:
921
959
  type:
922
960
  - array
923
961
  - 'null'
924
962
  items:
925
- type:
926
- - string
927
- - 'null'
963
+ type: string
928
964
  uploadedBy:
929
965
  type:
930
966
  - string
@@ -933,6 +969,7 @@ components:
933
969
  type:
934
970
  - string
935
971
  - 'null'
972
+ format: date-time
936
973
  deletedBy:
937
974
  type:
938
975
  - string
@@ -971,6 +1008,7 @@ components:
971
1008
  type:
972
1009
  - string
973
1010
  - 'null'
1011
+ format: date-time
974
1012
  deletedBy:
975
1013
  type:
976
1014
  - string
@@ -1063,7 +1101,6 @@ components:
1063
1101
  additionalProperties: {}
1064
1102
  - type: array
1065
1103
  items: {}
1066
- - type: 'null'
1067
1104
  terms:
1068
1105
  type:
1069
1106
  - string
@@ -1080,14 +1117,17 @@ components:
1080
1117
  type:
1081
1118
  - string
1082
1119
  - 'null'
1120
+ format: date-time
1083
1121
  sentAt:
1084
1122
  type:
1085
1123
  - string
1086
1124
  - 'null'
1125
+ format: date-time
1087
1126
  approvedAt:
1088
1127
  type:
1089
1128
  - string
1090
1129
  - 'null'
1130
+ format: date-time
1091
1131
  approvedBy:
1092
1132
  type:
1093
1133
  - string
@@ -1096,6 +1136,7 @@ components:
1096
1136
  type:
1097
1137
  - string
1098
1138
  - 'null'
1139
+ format: date-time
1099
1140
  rejectionReason:
1100
1141
  type:
1101
1142
  - string
@@ -1104,6 +1145,7 @@ components:
1104
1145
  type:
1105
1146
  - string
1106
1147
  - 'null'
1148
+ format: date-time
1107
1149
  signatureMeta:
1108
1150
  anyOf:
1109
1151
  - type: string
@@ -1114,7 +1156,6 @@ components:
1114
1156
  additionalProperties: {}
1115
1157
  - type: array
1116
1158
  items: {}
1117
- - type: 'null'
1118
1159
  signatureProvider:
1119
1160
  type:
1120
1161
  - string
@@ -1139,6 +1180,7 @@ components:
1139
1180
  type:
1140
1181
  - string
1141
1182
  - 'null'
1183
+ format: date-time
1142
1184
  revisionNotes:
1143
1185
  type:
1144
1186
  - string
@@ -1147,6 +1189,7 @@ components:
1147
1189
  type:
1148
1190
  - string
1149
1191
  - 'null'
1192
+ format: date-time
1150
1193
  convertedToInvoiceId:
1151
1194
  type:
1152
1195
  - integer
@@ -1157,6 +1200,7 @@ components:
1157
1200
  type:
1158
1201
  - string
1159
1202
  - 'null'
1203
+ format: date-time
1160
1204
  voidedBy:
1161
1205
  type:
1162
1206
  - string
@@ -1189,6 +1233,7 @@ components:
1189
1233
  type:
1190
1234
  - string
1191
1235
  - 'null'
1236
+ format: date-time
1192
1237
  qboId:
1193
1238
  type:
1194
1239
  - string
@@ -1201,6 +1246,7 @@ components:
1201
1246
  type:
1202
1247
  - string
1203
1248
  - 'null'
1249
+ format: date-time
1204
1250
  qboLastPushedHash:
1205
1251
  type:
1206
1252
  - string
@@ -1221,6 +1267,17 @@ components:
1221
1267
  type:
1222
1268
  - string
1223
1269
  - 'null'
1270
+ format: date-time
1271
+ sourceKind:
1272
+ type:
1273
+ - string
1274
+ - 'null'
1275
+ takeoffScanId:
1276
+ type:
1277
+ - integer
1278
+ - 'null'
1279
+ minimum: -2147483648
1280
+ maximum: 2147483647
1224
1281
  createdBy:
1225
1282
  type:
1226
1283
  - string
@@ -1229,6 +1286,7 @@ components:
1229
1286
  type:
1230
1287
  - string
1231
1288
  - 'null'
1289
+ format: date-time
1232
1290
  deletedBy:
1233
1291
  type:
1234
1292
  - string
@@ -1342,8 +1400,10 @@ components:
1342
1400
  type: boolean
1343
1401
  isOpening:
1344
1402
  type: boolean
1403
+ additionalProperties: {}
1345
1404
  captureMethod:
1346
1405
  type: string
1406
+ additionalProperties: {}
1347
1407
  doors:
1348
1408
  type: array
1349
1409
  items:
@@ -1365,6 +1425,10 @@ components:
1365
1425
  height:
1366
1426
  type: number
1367
1427
  exclusiveMinimum: 0
1428
+ sillHeightM:
1429
+ type: number
1430
+ minimum: 0
1431
+ maximum: 50
1368
1432
  hostWallIndex:
1369
1433
  type:
1370
1434
  - integer
@@ -1375,13 +1439,13 @@ components:
1375
1439
  minimum: 0
1376
1440
  swingHand:
1377
1441
  type: string
1378
- enum: &ref_0
1442
+ enum:
1379
1443
  - left
1380
1444
  - right
1381
1445
  - none
1382
1446
  placementSource:
1383
1447
  type: string
1384
- enum: &ref_1
1448
+ enum:
1385
1449
  - auto
1386
1450
  - manual
1387
1451
  required:
@@ -1409,6 +1473,10 @@ components:
1409
1473
  height:
1410
1474
  type: number
1411
1475
  exclusiveMinimum: 0
1476
+ sillHeightM:
1477
+ type: number
1478
+ minimum: 0
1479
+ maximum: 50
1412
1480
  hostWallIndex:
1413
1481
  type:
1414
1482
  - integer
@@ -1419,10 +1487,15 @@ components:
1419
1487
  minimum: 0
1420
1488
  swingHand:
1421
1489
  type: string
1422
- enum: *ref_0
1490
+ enum:
1491
+ - left
1492
+ - right
1493
+ - none
1423
1494
  placementSource:
1424
1495
  type: string
1425
- enum: *ref_1
1496
+ enum:
1497
+ - auto
1498
+ - manual
1426
1499
  required:
1427
1500
  - position
1428
1501
  - width
@@ -1448,6 +1521,10 @@ components:
1448
1521
  height:
1449
1522
  type: number
1450
1523
  exclusiveMinimum: 0
1524
+ sillHeightM:
1525
+ type: number
1526
+ minimum: 0
1527
+ maximum: 50
1451
1528
  hostWallIndex:
1452
1529
  type:
1453
1530
  - integer
@@ -1458,10 +1535,15 @@ components:
1458
1535
  minimum: 0
1459
1536
  swingHand:
1460
1537
  type: string
1461
- enum: *ref_0
1538
+ enum:
1539
+ - left
1540
+ - right
1541
+ - none
1462
1542
  placementSource:
1463
1543
  type: string
1464
- enum: *ref_1
1544
+ enum:
1545
+ - auto
1546
+ - manual
1465
1547
  required:
1466
1548
  - position
1467
1549
  - width
@@ -1500,6 +1582,7 @@ components:
1500
1582
  required:
1501
1583
  - id
1502
1584
  - position
1585
+ additionalProperties: {}
1503
1586
  objects:
1504
1587
  type: array
1505
1588
  items:
@@ -1528,6 +1611,7 @@ components:
1528
1611
  type: number
1529
1612
  rotation:
1530
1613
  type: number
1614
+ additionalProperties: {}
1531
1615
  boundaryPolygon:
1532
1616
  type: array
1533
1617
  items:
@@ -1545,6 +1629,7 @@ components:
1545
1629
  maxLength: 4096
1546
1630
  entryDoorwayId:
1547
1631
  type: string
1632
+ additionalProperties: {}
1548
1633
  description: >-
1549
1634
  Mobile-upload scan room. `doors`, `windows`, and `openings` are three distinct non-overlapping arrays
1550
1635
  — array membership IS the discriminator (there is no `kind` / `type` field on the item itself).
@@ -1554,6 +1639,7 @@ components:
1554
1639
  an `entryDoorwayId` target.
1555
1640
  required:
1556
1641
  - rooms
1642
+ additionalProperties: {}
1557
1643
  description: >-
1558
1644
  RoomPlan JSON envelope. `rooms[]` carries the per-room geometry
1559
1645
  (walls/doors/windows/openings/pins/objects/boundaryPolygon). iOS continues to upload positions in the
@@ -1701,6 +1787,7 @@ components:
1701
1787
  required:
1702
1788
  - roomPlanJSON
1703
1789
  - name
1790
+ additionalProperties: {}
1704
1791
  description: >-
1705
1792
  POST /api/jobs/:jobId/scans/mobile-upload body. v5 of the LiDAR contract (Task #879) — additive over v3/v4.
1706
1793
  Required: `roomPlanJSON` (object with nested `rooms` array) + `name`. All v3 and v4 payloads remain accepted
@@ -2174,7 +2261,7 @@ components:
2174
2261
  description: Null at the office — see siteType.
2175
2262
  siteType:
2176
2263
  type: string
2177
- enum: &ref_2
2264
+ enum:
2178
2265
  - job
2179
2266
  - office
2180
2267
  workDayId:
@@ -2213,8 +2300,8 @@ components:
2213
2300
  - 'null'
2214
2301
  source:
2215
2302
  type: string
2216
- description: '''manual'' (a button press) or ''auto'' (the resolver).'
2217
2303
  example: auto
2304
+ description: '''manual'' (a button press) or ''auto'' (the resolver).'
2218
2305
  excludedFromBudget:
2219
2306
  type: boolean
2220
2307
  description: >-
@@ -2263,6 +2350,7 @@ components:
2263
2350
  enum:
2264
2351
  - away
2265
2352
  - no_location
2353
+ - null
2266
2354
  description: >-
2267
2355
  Job time started by hand away from the job ('away') or with no usable location ('no_location'); null for a
2268
2356
  normal start. The office decides it.
@@ -2279,6 +2367,7 @@ components:
2279
2367
  - approved
2280
2368
  - not_approved
2281
2369
  - moved
2370
+ - null
2282
2371
  description: >-
2283
2372
  The office's decision on a flagged start; null while it waits. 'not_approved' stays on the timesheet but off
2284
2373
  the job's costing.
@@ -2379,8 +2468,8 @@ components:
2379
2468
  description: Null while the day is running.
2380
2469
  openedBy:
2381
2470
  type: string
2382
- description: '''tech'' (the button), ''admin'', or ''job_clock_in''.'
2383
2471
  example: tech
2472
+ description: '''tech'' (the button), ''admin'', or ''job_clock_in''.'
2384
2473
  closedBy:
2385
2474
  type:
2386
2475
  - string
@@ -2685,7 +2774,9 @@ components:
2685
2774
  description: Null for the office fence (siteType 'office').
2686
2775
  siteType:
2687
2776
  type: string
2688
- enum: *ref_2
2777
+ enum:
2778
+ - job
2779
+ - office
2689
2780
  jobName:
2690
2781
  type: string
2691
2782
  jobNumber:
@@ -2752,7 +2843,9 @@ components:
2752
2843
  - 'null'
2753
2844
  siteType:
2754
2845
  type: string
2755
- enum: *ref_2
2846
+ enum:
2847
+ - job
2848
+ - office
2756
2849
  description: Defaults to 'office' when jobId is null, else 'job'.
2757
2850
  kind:
2758
2851
  type: string
@@ -2788,10 +2881,11 @@ components:
2788
2881
  type:
2789
2882
  - string
2790
2883
  - 'null'
2791
- enum: &ref_5
2884
+ enum:
2792
2885
  - ios
2793
2886
  - web
2794
2887
  - android
2888
+ - null
2795
2889
  autoClockEnabled:
2796
2890
  type: boolean
2797
2891
  description: The user's auto-clock toggle at crossing time. False → the crossing is logged but never acted on.
@@ -2843,8 +2937,8 @@ components:
2843
2937
  type:
2844
2938
  - string
2845
2939
  - 'null'
2846
- description: Why the batch was dropped. On 'no_consent' the client should clear its queue rather than retry.
2847
2940
  example: no_consent
2941
+ description: Why the batch was dropped. On 'no_consent' the client should clear its queue rather than retry.
2848
2942
  resolver:
2849
2943
  type:
2850
2944
  - object
@@ -2894,16 +2988,16 @@ components:
2894
2988
  type: boolean
2895
2989
  dwellSeconds:
2896
2990
  type: integer
2897
- description: >-
2898
- How long a device must stay on one side of a fence before it counts. A choice from a fixed set of steps, not
2899
- a free number: a tech driving past a job must not be clocked in, and one walking in must not wait. An older
2900
- org may still have a free value stored; the server snaps it to the nearest step, so read this value rather
2901
- than assuming what was configured.
2902
2991
  enum:
2903
2992
  - 30
2904
2993
  - 60
2905
2994
  - 100
2906
2995
  - 120
2996
+ description: >-
2997
+ How long a device must stay on one side of a fence before it counts. A choice from a fixed set of steps, not
2998
+ a free number: a tech driving past a job must not be clocked in, and one walking in must not wait. An older
2999
+ org may still have a free value stored; the server snaps it to the nearest step, so read this value rather
3000
+ than assuming what was configured.
2907
3001
  staleShiftHours:
2908
3002
  type: integer
2909
3003
  autoCloseHours:
@@ -3045,14 +3139,14 @@ components:
3045
3139
  type:
3046
3140
  - string
3047
3141
  - 'null'
3048
- description: '''HH:MM'' local. Null = all day, and always null for ''off'' and ''pto''.'
3049
3142
  example: '08:00'
3143
+ description: '''HH:MM'' local. Null = all day, and always null for ''off'' and ''pto''.'
3050
3144
  endTime:
3051
3145
  type:
3052
3146
  - string
3053
3147
  - 'null'
3054
- description: An end at or before the start means the shift runs overnight into the next day.
3055
3148
  example: '17:00'
3149
+ description: An end at or before the start means the shift runs overnight into the next day.
3056
3150
  kind:
3057
3151
  type: string
3058
3152
  enum:
@@ -3115,7 +3209,7 @@ components:
3115
3209
  - rejected
3116
3210
  kind:
3117
3211
  type: string
3118
- enum: &ref_7
3212
+ enum:
3119
3213
  - pto
3120
3214
  - sick
3121
3215
  - 'off'
@@ -3323,6 +3417,122 @@ components:
3323
3417
  description: >-
3324
3418
  The signed-in person's request to have their account deleted. pending: waiting for the company; completed: the
3325
3419
  company marked it done; cancelled: the company cancelled it (asking again starts a new one).
3420
+ DoorwayEditCommand:
3421
+ oneOf:
3422
+ - type: object
3423
+ properties:
3424
+ action:
3425
+ type: string
3426
+ enum:
3427
+ - delete
3428
+ roomId:
3429
+ type: integer
3430
+ exclusiveMinimum: 0
3431
+ openingId:
3432
+ type: string
3433
+ pattern: ^[A-Za-z0-9:_-]{1,128}$
3434
+ revision:
3435
+ type: string
3436
+ pattern: ^[a-f0-9]{64}$
3437
+ confirmed:
3438
+ type: boolean
3439
+ enum:
3440
+ - true
3441
+ required:
3442
+ - action
3443
+ - roomId
3444
+ - openingId
3445
+ - revision
3446
+ - confirmed
3447
+ additionalProperties: false
3448
+ - type: object
3449
+ properties:
3450
+ action:
3451
+ type: string
3452
+ enum:
3453
+ - undo
3454
+ token:
3455
+ type: string
3456
+ minLength: 1
3457
+ maxLength: 1500100
3458
+ required:
3459
+ - action
3460
+ - token
3461
+ additionalProperties: false
3462
+ - type: object
3463
+ properties:
3464
+ action:
3465
+ type: string
3466
+ enum:
3467
+ - connect
3468
+ rooms:
3469
+ type: array
3470
+ items:
3471
+ type: object
3472
+ properties:
3473
+ id:
3474
+ type: integer
3475
+ exclusiveMinimum: 0
3476
+ revision:
3477
+ type: string
3478
+ pattern: ^[a-f0-9]{64}$
3479
+ geometry:
3480
+ type: object
3481
+ additionalProperties: {}
3482
+ required:
3483
+ - id
3484
+ - revision
3485
+ - geometry
3486
+ additionalProperties: false
3487
+ links:
3488
+ type: array
3489
+ items:
3490
+ type: object
3491
+ properties:
3492
+ roomAId:
3493
+ type: integer
3494
+ exclusiveMinimum: 0
3495
+ roomBId:
3496
+ type: integer
3497
+ exclusiveMinimum: 0
3498
+ doorAIndex:
3499
+ type: integer
3500
+ minimum: 0
3501
+ maximum: 63
3502
+ doorBIndex:
3503
+ type: integer
3504
+ minimum: 0
3505
+ maximum: 63
3506
+ required:
3507
+ - roomAId
3508
+ - roomBId
3509
+ - doorAIndex
3510
+ - doorBIndex
3511
+ additionalProperties: false
3512
+ minItems: 1
3513
+ maxItems: 64
3514
+ required:
3515
+ - action
3516
+ - rooms
3517
+ - links
3518
+ additionalProperties: false
3519
+ DoorwayEditResult:
3520
+ type: object
3521
+ properties:
3522
+ ok:
3523
+ type: boolean
3524
+ enum:
3525
+ - true
3526
+ token:
3527
+ type: string
3528
+ roomIds:
3529
+ type: array
3530
+ items:
3531
+ type: integer
3532
+ required:
3533
+ - ok
3534
+ - token
3535
+ - roomIds
3326
3536
  parameters: {}
3327
3537
  paths:
3328
3538
  /api/version:
@@ -3371,7 +3581,7 @@ paths:
3371
3581
  - auth
3372
3582
  - features
3373
3583
  parameters:
3374
- - &ref_3
3584
+ - &ref_0
3375
3585
  name: X-Client-Version
3376
3586
  in: header
3377
3587
  required: false
@@ -3398,7 +3608,7 @@ paths:
3398
3608
  tags:
3399
3609
  - lidar
3400
3610
  parameters:
3401
- - *ref_3
3611
+ - *ref_0
3402
3612
  - schema:
3403
3613
  type: integer
3404
3614
  exclusiveMinimum: 0
@@ -3453,7 +3663,7 @@ paths:
3453
3663
  tags:
3454
3664
  - lidar
3455
3665
  parameters:
3456
- - *ref_3
3666
+ - *ref_0
3457
3667
  - schema:
3458
3668
  type: integer
3459
3669
  exclusiveMinimum: 0
@@ -3586,7 +3796,7 @@ paths:
3586
3796
  tags:
3587
3797
  - jobs
3588
3798
  parameters:
3589
- - *ref_3
3799
+ - *ref_0
3590
3800
  responses:
3591
3801
  '200':
3592
3802
  description: Array of jobs.
@@ -3607,7 +3817,7 @@ paths:
3607
3817
  tags:
3608
3818
  - jobs
3609
3819
  parameters:
3610
- - *ref_3
3820
+ - *ref_0
3611
3821
  requestBody:
3612
3822
  content:
3613
3823
  application/json:
@@ -3632,7 +3842,7 @@ paths:
3632
3842
  tags:
3633
3843
  - jobs
3634
3844
  parameters:
3635
- - *ref_3
3845
+ - *ref_0
3636
3846
  - schema:
3637
3847
  type: integer
3638
3848
  exclusiveMinimum: 0
@@ -3664,7 +3874,7 @@ paths:
3664
3874
  tags:
3665
3875
  - chatty
3666
3876
  parameters:
3667
- - *ref_3
3877
+ - *ref_0
3668
3878
  requestBody:
3669
3879
  content:
3670
3880
  application/json:
@@ -3701,7 +3911,7 @@ paths:
3701
3911
  tags:
3702
3912
  - chatty
3703
3913
  parameters:
3704
- - *ref_3
3914
+ - *ref_0
3705
3915
  - schema:
3706
3916
  type: string
3707
3917
  required: true
@@ -3734,7 +3944,7 @@ paths:
3734
3944
  tags:
3735
3945
  - chatty
3736
3946
  parameters:
3737
- - *ref_3
3947
+ - *ref_0
3738
3948
  - schema:
3739
3949
  type: string
3740
3950
  required: true
@@ -3761,7 +3971,7 @@ paths:
3761
3971
  tags:
3762
3972
  - auth
3763
3973
  parameters:
3764
- - *ref_3
3974
+ - *ref_0
3765
3975
  responses:
3766
3976
  '200':
3767
3977
  description: Authenticated user.
@@ -3787,7 +3997,7 @@ paths:
3787
3997
  tags:
3788
3998
  - crm
3789
3999
  parameters:
3790
- - *ref_3
4000
+ - *ref_0
3791
4001
  responses:
3792
4002
  '200':
3793
4003
  description: Array of contacts.
@@ -3845,11 +4055,11 @@ paths:
3845
4055
  additionalProperties: {}
3846
4056
  - type: array
3847
4057
  items: {}
3848
- - type: 'null'
3849
4058
  lastContactDate:
3850
4059
  type:
3851
4060
  - string
3852
4061
  - 'null'
4062
+ format: date-time
3853
4063
  parentContactId:
3854
4064
  type:
3855
4065
  - integer
@@ -3962,6 +4172,7 @@ paths:
3962
4172
  type:
3963
4173
  - string
3964
4174
  - 'null'
4175
+ format: date-time
3965
4176
  qboLastPushedHash:
3966
4177
  type:
3967
4178
  - string
@@ -3974,6 +4185,7 @@ paths:
3974
4185
  type:
3975
4186
  - string
3976
4187
  - 'null'
4188
+ format: date-time
3977
4189
  deletedBy:
3978
4190
  type:
3979
4191
  - string
@@ -3997,7 +4209,7 @@ paths:
3997
4209
  tags:
3998
4210
  - crm
3999
4211
  parameters:
4000
- - *ref_3
4212
+ - *ref_0
4001
4213
  requestBody:
4002
4214
  content:
4003
4215
  application/json:
@@ -4050,11 +4262,11 @@ paths:
4050
4262
  additionalProperties: {}
4051
4263
  - type: array
4052
4264
  items: {}
4053
- - type: 'null'
4054
4265
  lastContactDate:
4055
4266
  type:
4056
4267
  - string
4057
4268
  - 'null'
4269
+ format: date-time
4058
4270
  parentContactId:
4059
4271
  type:
4060
4272
  - integer
@@ -4167,6 +4379,7 @@ paths:
4167
4379
  type:
4168
4380
  - string
4169
4381
  - 'null'
4382
+ format: date-time
4170
4383
  qboLastPushedHash:
4171
4384
  type:
4172
4385
  - string
@@ -4179,6 +4392,7 @@ paths:
4179
4392
  type:
4180
4393
  - string
4181
4394
  - 'null'
4395
+ format: date-time
4182
4396
  deletedBy:
4183
4397
  type:
4184
4398
  - string
@@ -4240,11 +4454,11 @@ paths:
4240
4454
  additionalProperties: {}
4241
4455
  - type: array
4242
4456
  items: {}
4243
- - type: 'null'
4244
4457
  lastContactDate:
4245
4458
  type:
4246
4459
  - string
4247
4460
  - 'null'
4461
+ format: date-time
4248
4462
  parentContactId:
4249
4463
  type:
4250
4464
  - integer
@@ -4357,6 +4571,7 @@ paths:
4357
4571
  type:
4358
4572
  - string
4359
4573
  - 'null'
4574
+ format: date-time
4360
4575
  qboLastPushedHash:
4361
4576
  type:
4362
4577
  - string
@@ -4369,6 +4584,7 @@ paths:
4369
4584
  type:
4370
4585
  - string
4371
4586
  - 'null'
4587
+ format: date-time
4372
4588
  deletedBy:
4373
4589
  type:
4374
4590
  - string
@@ -4393,7 +4609,7 @@ paths:
4393
4609
  tags:
4394
4610
  - photos
4395
4611
  parameters:
4396
- - *ref_3
4612
+ - *ref_0
4397
4613
  - schema:
4398
4614
  type: integer
4399
4615
  exclusiveMinimum: 0
@@ -4436,7 +4652,7 @@ paths:
4436
4652
  tags:
4437
4653
  - lidar
4438
4654
  parameters:
4439
- - *ref_3
4655
+ - *ref_0
4440
4656
  - schema:
4441
4657
  type: integer
4442
4658
  exclusiveMinimum: 0
@@ -4459,7 +4675,7 @@ paths:
4459
4675
  tags:
4460
4676
  - lidar
4461
4677
  parameters:
4462
- - *ref_3
4678
+ - *ref_0
4463
4679
  - schema:
4464
4680
  type: integer
4465
4681
  exclusiveMinimum: 0
@@ -4506,6 +4722,10 @@ paths:
4506
4722
  height:
4507
4723
  type: number
4508
4724
  exclusiveMinimum: 0
4725
+ sillHeightM:
4726
+ type: number
4727
+ minimum: 0
4728
+ maximum: 50
4509
4729
  hostWallIndex:
4510
4730
  type:
4511
4731
  - integer
@@ -4516,10 +4736,15 @@ paths:
4516
4736
  minimum: 0
4517
4737
  swingHand:
4518
4738
  type: string
4519
- enum: *ref_0
4739
+ enum:
4740
+ - left
4741
+ - right
4742
+ - none
4520
4743
  placementSource:
4521
4744
  type: string
4522
- enum: *ref_1
4745
+ enum:
4746
+ - auto
4747
+ - manual
4523
4748
  duplicateOf:
4524
4749
  type: object
4525
4750
  properties:
@@ -4568,6 +4793,10 @@ paths:
4568
4793
  height:
4569
4794
  type: number
4570
4795
  exclusiveMinimum: 0
4796
+ sillHeightM:
4797
+ type: number
4798
+ minimum: 0
4799
+ maximum: 50
4571
4800
  hostWallIndex:
4572
4801
  type:
4573
4802
  - integer
@@ -4578,10 +4807,15 @@ paths:
4578
4807
  minimum: 0
4579
4808
  swingHand:
4580
4809
  type: string
4581
- enum: *ref_0
4810
+ enum:
4811
+ - left
4812
+ - right
4813
+ - none
4582
4814
  placementSource:
4583
4815
  type: string
4584
- enum: *ref_1
4816
+ enum:
4817
+ - auto
4818
+ - manual
4585
4819
  required:
4586
4820
  - position
4587
4821
  - width
@@ -4610,6 +4844,10 @@ paths:
4610
4844
  height:
4611
4845
  type: number
4612
4846
  exclusiveMinimum: 0
4847
+ sillHeightM:
4848
+ type: number
4849
+ minimum: 0
4850
+ maximum: 50
4613
4851
  hostWallIndex:
4614
4852
  type:
4615
4853
  - integer
@@ -4620,10 +4858,15 @@ paths:
4620
4858
  minimum: 0
4621
4859
  swingHand:
4622
4860
  type: string
4623
- enum: *ref_0
4861
+ enum:
4862
+ - left
4863
+ - right
4864
+ - none
4624
4865
  placementSource:
4625
4866
  type: string
4626
- enum: *ref_1
4867
+ enum:
4868
+ - auto
4869
+ - manual
4627
4870
  required:
4628
4871
  - position
4629
4872
  - width
@@ -4686,7 +4929,7 @@ paths:
4686
4929
  tags:
4687
4930
  - lidar
4688
4931
  parameters:
4689
- - *ref_3
4932
+ - *ref_0
4690
4933
  - schema:
4691
4934
  type: integer
4692
4935
  exclusiveMinimum: 0
@@ -4767,6 +5010,10 @@ paths:
4767
5010
  height:
4768
5011
  type: number
4769
5012
  exclusiveMinimum: 0
5013
+ sillHeightM:
5014
+ type: number
5015
+ minimum: 0
5016
+ maximum: 50
4770
5017
  hostWallIndex:
4771
5018
  type:
4772
5019
  - integer
@@ -4777,10 +5024,15 @@ paths:
4777
5024
  minimum: 0
4778
5025
  swingHand:
4779
5026
  type: string
4780
- enum: *ref_0
5027
+ enum:
5028
+ - left
5029
+ - right
5030
+ - none
4781
5031
  placementSource:
4782
5032
  type: string
4783
- enum: *ref_1
5033
+ enum:
5034
+ - auto
5035
+ - manual
4784
5036
  duplicateOf:
4785
5037
  type: object
4786
5038
  properties:
@@ -4830,6 +5082,10 @@ paths:
4830
5082
  height:
4831
5083
  type: number
4832
5084
  exclusiveMinimum: 0
5085
+ sillHeightM:
5086
+ type: number
5087
+ minimum: 0
5088
+ maximum: 50
4833
5089
  hostWallIndex:
4834
5090
  type:
4835
5091
  - integer
@@ -4840,10 +5096,15 @@ paths:
4840
5096
  minimum: 0
4841
5097
  swingHand:
4842
5098
  type: string
4843
- enum: *ref_0
5099
+ enum:
5100
+ - left
5101
+ - right
5102
+ - none
4844
5103
  placementSource:
4845
5104
  type: string
4846
- enum: *ref_1
5105
+ enum:
5106
+ - auto
5107
+ - manual
4847
5108
  required:
4848
5109
  - position
4849
5110
  - width
@@ -4872,6 +5133,10 @@ paths:
4872
5133
  height:
4873
5134
  type: number
4874
5135
  exclusiveMinimum: 0
5136
+ sillHeightM:
5137
+ type: number
5138
+ minimum: 0
5139
+ maximum: 50
4875
5140
  hostWallIndex:
4876
5141
  type:
4877
5142
  - integer
@@ -4882,10 +5147,15 @@ paths:
4882
5147
  minimum: 0
4883
5148
  swingHand:
4884
5149
  type: string
4885
- enum: *ref_0
5150
+ enum:
5151
+ - left
5152
+ - right
5153
+ - none
4886
5154
  placementSource:
4887
5155
  type: string
4888
- enum: *ref_1
5156
+ enum:
5157
+ - auto
5158
+ - manual
4889
5159
  required:
4890
5160
  - position
4891
5161
  - width
@@ -4941,7 +5211,7 @@ paths:
4941
5211
  tags:
4942
5212
  - chatty
4943
5213
  parameters:
4944
- - *ref_3
5214
+ - *ref_0
4945
5215
  responses:
4946
5216
  '200':
4947
5217
  description: Bare array of tool definitions.
@@ -5043,7 +5313,7 @@ paths:
5043
5313
  tags:
5044
5314
  - chatty
5045
5315
  parameters:
5046
- - *ref_3
5316
+ - *ref_0
5047
5317
  requestBody:
5048
5318
  content:
5049
5319
  application/json:
@@ -5118,7 +5388,7 @@ paths:
5118
5388
  tags:
5119
5389
  - chatty
5120
5390
  parameters:
5121
- - *ref_3
5391
+ - *ref_0
5122
5392
  responses:
5123
5393
  '200':
5124
5394
  description: System instructions + knowledge-base / workflow-stage load flags.
@@ -5168,7 +5438,7 @@ paths:
5168
5438
  tags:
5169
5439
  - chatty
5170
5440
  parameters:
5171
- - *ref_3
5441
+ - *ref_0
5172
5442
  requestBody:
5173
5443
  content:
5174
5444
  application/json:
@@ -5285,7 +5555,7 @@ paths:
5285
5555
  tags:
5286
5556
  - chatty
5287
5557
  parameters:
5288
- - *ref_3
5558
+ - *ref_0
5289
5559
  responses:
5290
5560
  '200':
5291
5561
  description: Fresh CSRF token.
@@ -5321,7 +5591,7 @@ paths:
5321
5591
  tags:
5322
5592
  - chatty
5323
5593
  parameters:
5324
- - *ref_3
5594
+ - *ref_0
5325
5595
  - name: X-CSRF-Token
5326
5596
  in: header
5327
5597
  required: true
@@ -5409,8 +5679,8 @@ paths:
5409
5679
  tags:
5410
5680
  - time-tracking
5411
5681
  parameters:
5412
- - *ref_3
5413
- - &ref_4
5682
+ - *ref_0
5683
+ - &ref_1
5414
5684
  name: X-Day-Clock
5415
5685
  in: header
5416
5686
  required: false
@@ -5457,8 +5727,8 @@ paths:
5457
5727
  tags:
5458
5728
  - time-tracking
5459
5729
  parameters:
5460
- - *ref_3
5461
- - *ref_4
5730
+ - *ref_0
5731
+ - *ref_1
5462
5732
  requestBody:
5463
5733
  content:
5464
5734
  application/json:
@@ -5486,7 +5756,11 @@ paths:
5486
5756
  type:
5487
5757
  - string
5488
5758
  - 'null'
5489
- enum: *ref_5
5759
+ enum:
5760
+ - ios
5761
+ - web
5762
+ - android
5763
+ - null
5490
5764
  occurredAt:
5491
5765
  type:
5492
5766
  - string
@@ -5593,8 +5867,8 @@ paths:
5593
5867
  tags:
5594
5868
  - time-tracking
5595
5869
  parameters:
5596
- - *ref_3
5597
- - *ref_4
5870
+ - *ref_0
5871
+ - *ref_1
5598
5872
  description: >-
5599
5873
  A late Clock Out (T6): with tapElapsedMs proving its time, it keeps its real time however old. When the safety
5600
5874
  net already closed the day (the automatic close), a proven Clock Out earlier than that close replaces it
@@ -5627,7 +5901,11 @@ paths:
5627
5901
  type:
5628
5902
  - string
5629
5903
  - 'null'
5630
- enum: *ref_5
5904
+ enum:
5905
+ - ios
5906
+ - web
5907
+ - android
5908
+ - null
5631
5909
  occurredAt:
5632
5910
  type:
5633
5911
  - string
@@ -5732,8 +6010,8 @@ paths:
5732
6010
  tags:
5733
6011
  - time-tracking
5734
6012
  parameters:
5735
- - *ref_3
5736
- - &ref_6
6013
+ - *ref_0
6014
+ - &ref_2
5737
6015
  name: X-Sites
5738
6016
  in: header
5739
6017
  required: false
@@ -5800,7 +6078,7 @@ paths:
5800
6078
  tags:
5801
6079
  - time-tracking
5802
6080
  parameters:
5803
- - *ref_3
6081
+ - *ref_0
5804
6082
  responses:
5805
6083
  '200':
5806
6084
  description: Effective settings, clamped.
@@ -5838,7 +6116,7 @@ paths:
5838
6116
  tags:
5839
6117
  - time-tracking
5840
6118
  parameters:
5841
- - *ref_3
6119
+ - *ref_0
5842
6120
  - name: scope
5843
6121
  in: query
5844
6122
  required: false
@@ -5903,8 +6181,8 @@ paths:
5903
6181
  tags:
5904
6182
  - time-tracking
5905
6183
  parameters:
5906
- - *ref_3
5907
- - *ref_6
6184
+ - *ref_0
6185
+ - *ref_2
5908
6186
  - name: scope
5909
6187
  in: query
5910
6188
  required: false
@@ -5953,8 +6231,8 @@ paths:
5953
6231
  tags:
5954
6232
  - time-tracking
5955
6233
  parameters:
5956
- - *ref_3
5957
- - *ref_6
6234
+ - *ref_0
6235
+ - *ref_2
5958
6236
  - name: userId
5959
6237
  in: query
5960
6238
  required: false
@@ -6031,9 +6309,9 @@ paths:
6031
6309
  tags:
6032
6310
  - time-tracking
6033
6311
  parameters:
6034
- - *ref_3
6035
- - *ref_6
6036
- - *ref_4
6312
+ - *ref_0
6313
+ - *ref_2
6314
+ - *ref_1
6037
6315
  requestBody:
6038
6316
  content:
6039
6317
  application/json:
@@ -6047,7 +6325,9 @@ paths:
6047
6325
  description: Omit or null together with siteType 'office'.
6048
6326
  siteType:
6049
6327
  type: string
6050
- enum: *ref_2
6328
+ enum:
6329
+ - job
6330
+ - office
6051
6331
  userId:
6052
6332
  type: string
6053
6333
  description: Clock someone else in. Requires time_tracking.edit_all.
@@ -6091,7 +6371,11 @@ paths:
6091
6371
  type:
6092
6372
  - string
6093
6373
  - 'null'
6094
- enum: *ref_5
6374
+ enum:
6375
+ - ios
6376
+ - web
6377
+ - android
6378
+ - null
6095
6379
  canConfirmAway:
6096
6380
  type: boolean
6097
6381
  description: >-
@@ -6210,9 +6494,9 @@ paths:
6210
6494
  tags:
6211
6495
  - time-tracking
6212
6496
  parameters:
6213
- - *ref_3
6214
- - *ref_6
6215
- - *ref_4
6497
+ - *ref_0
6498
+ - *ref_2
6499
+ - *ref_1
6216
6500
  requestBody:
6217
6501
  content:
6218
6502
  application/json:
@@ -6225,7 +6509,9 @@ paths:
6225
6509
  - 'null'
6226
6510
  siteType:
6227
6511
  type: string
6228
- enum: *ref_2
6512
+ enum:
6513
+ - job
6514
+ - office
6229
6515
  userId:
6230
6516
  type: string
6231
6517
  description: Requires time_tracking.edit_all.
@@ -6256,7 +6542,11 @@ paths:
6256
6542
  type:
6257
6543
  - string
6258
6544
  - 'null'
6259
- enum: *ref_5
6545
+ enum:
6546
+ - ios
6547
+ - web
6548
+ - android
6549
+ - null
6260
6550
  tapElapsedMs:
6261
6551
  type:
6262
6552
  - integer
@@ -6341,7 +6631,7 @@ paths:
6341
6631
  tags:
6342
6632
  - time-tracking
6343
6633
  parameters:
6344
- - *ref_3
6634
+ - *ref_0
6345
6635
  requestBody:
6346
6636
  content:
6347
6637
  application/json:
@@ -6492,7 +6782,7 @@ paths:
6492
6782
  tags:
6493
6783
  - time-tracking
6494
6784
  parameters:
6495
- - *ref_3
6785
+ - *ref_0
6496
6786
  - schema:
6497
6787
  type: integer
6498
6788
  required: true
@@ -6552,7 +6842,7 @@ paths:
6552
6842
  tags:
6553
6843
  - time-tracking
6554
6844
  parameters:
6555
- - *ref_3
6845
+ - *ref_0
6556
6846
  - schema:
6557
6847
  type: integer
6558
6848
  required: true
@@ -6586,7 +6876,11 @@ paths:
6586
6876
  type:
6587
6877
  - string
6588
6878
  - 'null'
6589
- enum: *ref_5
6879
+ enum:
6880
+ - ios
6881
+ - web
6882
+ - android
6883
+ - null
6590
6884
  required:
6591
6885
  - kind
6592
6886
  - lat
@@ -6660,7 +6954,7 @@ paths:
6660
6954
  tags:
6661
6955
  - time-tracking
6662
6956
  parameters:
6663
- - *ref_3
6957
+ - *ref_0
6664
6958
  requestBody:
6665
6959
  content:
6666
6960
  application/json:
@@ -6710,7 +7004,11 @@ paths:
6710
7004
  type:
6711
7005
  - string
6712
7006
  - 'null'
6713
- enum: *ref_5
7007
+ enum:
7008
+ - ios
7009
+ - web
7010
+ - android
7011
+ - null
6714
7012
  required:
6715
7013
  - pings
6716
7014
  responses:
@@ -6756,7 +7054,7 @@ paths:
6756
7054
  tags:
6757
7055
  - time-tracking
6758
7056
  parameters:
6759
- - *ref_3
7057
+ - *ref_0
6760
7058
  - name: since
6761
7059
  in: query
6762
7060
  required: false
@@ -6825,7 +7123,7 @@ paths:
6825
7123
  tags:
6826
7124
  - schedule
6827
7125
  parameters:
6828
- - *ref_3
7126
+ - *ref_0
6829
7127
  - name: date
6830
7128
  in: query
6831
7129
  required: false
@@ -6861,7 +7159,7 @@ paths:
6861
7159
  tags:
6862
7160
  - schedule
6863
7161
  parameters:
6864
- - *ref_3
7162
+ - *ref_0
6865
7163
  requestBody:
6866
7164
  content:
6867
7165
  application/json:
@@ -6870,7 +7168,10 @@ paths:
6870
7168
  properties:
6871
7169
  kind:
6872
7170
  type: string
6873
- enum: *ref_7
7171
+ enum:
7172
+ - pto
7173
+ - sick
7174
+ - 'off'
6874
7175
  startDate:
6875
7176
  type: string
6876
7177
  format: date
@@ -6936,7 +7237,7 @@ paths:
6936
7237
  tags:
6937
7238
  - account
6938
7239
  parameters:
6939
- - *ref_3
7240
+ - *ref_0
6940
7241
  requestBody:
6941
7242
  content:
6942
7243
  application/json:
@@ -6997,7 +7298,7 @@ paths:
6997
7298
  tags:
6998
7299
  - account
6999
7300
  parameters:
7000
- - *ref_3
7301
+ - *ref_0
7001
7302
  responses:
7002
7303
  '200':
7003
7304
  description: The newest request, whatever its status.
@@ -7035,4 +7336,100 @@ paths:
7035
7336
  application/json:
7036
7337
  schema:
7037
7338
  $ref: '#/components/schemas/UpgradeRequiredEnvelope'
7339
+ /api/sketches/{sketchId}/doorway-edits:
7340
+ post:
7341
+ tags:
7342
+ - lidar
7343
+ summary: Save a confirmed shared-doorway edit atomically, or undo it.
7344
+ description: >-
7345
+ Requires authenticated organization and job access. Delete removes both linked openings and only their doorway
7346
+ connection. Undo receipts are user/scope-bound, expire after eight hours, and reject intervening geometry or
7347
+ connection changes. Connect is supported for sketches only. Room reads provide openingId and openingRevision;
7348
+ existing records are not backfilled.
7349
+ parameters:
7350
+ - name: sketchId
7351
+ in: path
7352
+ required: true
7353
+ schema:
7354
+ type: integer
7355
+ minimum: 1
7356
+ requestBody:
7357
+ required: true
7358
+ content:
7359
+ application/json:
7360
+ schema:
7361
+ $ref: '#/components/schemas/DoorwayEditCommand'
7362
+ responses:
7363
+ '200':
7364
+ description: Committed both rooms and their connection changes; token reverses this action.
7365
+ content:
7366
+ application/json:
7367
+ schema:
7368
+ $ref: '#/components/schemas/DoorwayEditResult'
7369
+ '400':
7370
+ description: Invalid command or missing explicit confirmation.
7371
+ content:
7372
+ application/json:
7373
+ schema:
7374
+ $ref: '#/components/schemas/ErrorEnvelope'
7375
+ '401':
7376
+ description: Authentication required.
7377
+ '403':
7378
+ description: Job access denied.
7379
+ '404':
7380
+ description: Scope not found in the organization.
7381
+ '409':
7382
+ description: Stale or ambiguous opening identity, or undo would overwrite newer work.
7383
+ content:
7384
+ application/json:
7385
+ schema:
7386
+ $ref: '#/components/schemas/ErrorEnvelope'
7387
+ /api/floors/{floorId}/doorway-edits:
7388
+ post:
7389
+ tags:
7390
+ - lidar
7391
+ summary: Save a confirmed shared-doorway edit atomically, or undo it.
7392
+ description: >-
7393
+ Requires authenticated organization and job access. Delete removes both linked openings and only their doorway
7394
+ connection. Undo receipts are user/scope-bound, expire after eight hours, and reject intervening geometry or
7395
+ connection changes. Connect is supported for sketches only. Room reads provide openingId and openingRevision;
7396
+ existing records are not backfilled.
7397
+ parameters:
7398
+ - name: floorId
7399
+ in: path
7400
+ required: true
7401
+ schema:
7402
+ type: integer
7403
+ minimum: 1
7404
+ requestBody:
7405
+ required: true
7406
+ content:
7407
+ application/json:
7408
+ schema:
7409
+ $ref: '#/components/schemas/DoorwayEditCommand'
7410
+ responses:
7411
+ '200':
7412
+ description: Committed both rooms and their connection changes; token reverses this action.
7413
+ content:
7414
+ application/json:
7415
+ schema:
7416
+ $ref: '#/components/schemas/DoorwayEditResult'
7417
+ '400':
7418
+ description: Invalid command or missing explicit confirmation.
7419
+ content:
7420
+ application/json:
7421
+ schema:
7422
+ $ref: '#/components/schemas/ErrorEnvelope'
7423
+ '401':
7424
+ description: Authentication required.
7425
+ '403':
7426
+ description: Job access denied.
7427
+ '404':
7428
+ description: Scope not found in the organization.
7429
+ '409':
7430
+ description: Stale or ambiguous opening identity, or undo would overwrite newer work.
7431
+ content:
7432
+ application/json:
7433
+ schema:
7434
+ $ref: '#/components/schemas/ErrorEnvelope'
7038
7435
  webhooks: {}