@epilot/cli 0.1.173 → 0.1.175

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 (87) hide show
  1. package/README.md +1 -1
  2. package/definitions/automation.json +228 -7
  3. package/definitions/event-catalog.json +310 -1
  4. package/definitions/integration-toolkit.json +272 -1
  5. package/definitions/metering.json +19 -8
  6. package/dist/{access-token-E3ZZM7MG.js → access-token-67HL5HSN.js} +2 -2
  7. package/dist/{add-component-HAO3OWKD.js → add-component-GLQQWNQA.js} +2 -2
  8. package/dist/{add-function-4JGKOGZG.js → add-function-6PWQT77G.js} +2 -2
  9. package/dist/{address-6KZXMIGT.js → address-WODVCUGQ.js} +2 -2
  10. package/dist/{address-suggestions-TSVOWZHT.js → address-suggestions-RZWQVON5.js} +2 -2
  11. package/dist/{ai-agents-D4NZIVX5.js → ai-agents-IJHQ4ED6.js} +2 -2
  12. package/dist/{api-M5JYFJZU.js → api-Y35WRMY5.js} +2 -2
  13. package/dist/app-FH3RDD2Y.js +26 -0
  14. package/dist/{audit-logs-RU3MBODJ.js → audit-logs-J5YYNUNM.js} +2 -2
  15. package/dist/auth-WMXFMPWE.js +0 -0
  16. package/dist/auth-login-3AY5U4JU.js +0 -0
  17. package/dist/auth-token-APXLIQAO.js +0 -0
  18. package/dist/{automation-YVD55ROR.js → automation-ZBEBRMVQ.js} +2 -2
  19. package/dist/{billing-6N62I4UF.js → billing-EOIAT2I7.js} +2 -2
  20. package/dist/bin/epilot.js +58 -58
  21. package/dist/{blueprint-manifest-R4RCZBAT.js → blueprint-manifest-PEUIIZYW.js} +2 -2
  22. package/dist/{calendar-YIZ6DROM.js → calendar-EBOGHBCK.js} +2 -2
  23. package/dist/{chat-IF5UZQZD.js → chat-RWCKONE3.js} +2 -2
  24. package/dist/{chunk-2MIW63GJ.js → chunk-3GAKE7F5.js} +1 -1
  25. package/dist/chunk-7ZQ666ZQ.js +0 -0
  26. package/dist/{chunk-UCRP455M.js → chunk-HO4O3AUS.js} +5 -1
  27. package/dist/chunk-IOLKUHUB.js +0 -0
  28. package/dist/chunk-M3M3C5WH.js +0 -0
  29. package/dist/{chunk-HER4LYMM.js → chunk-O5RCC5LE.js} +1 -1
  30. package/dist/{chunk-WG44JNQM.js → chunk-RQEPA5SA.js} +1 -1
  31. package/dist/chunk-YHQA2AVG.js +0 -0
  32. package/dist/{completion-VQH3TEHN.js → completion-36LMDUHB.js} +1 -1
  33. package/dist/config-DGZIMLZK.js +0 -0
  34. package/dist/{configuration-hub-Z7GNNCCA.js → configuration-hub-D6ZHDFUL.js} +2 -2
  35. package/dist/{consent-2QP5AD62.js → consent-LHE5HO7C.js} +2 -2
  36. package/dist/{customer-portal-JHVQZTBE.js → customer-portal-UBMQ3IWW.js} +2 -2
  37. package/dist/{dashboard-T2VDYZSR.js → dashboard-U4MJOVHG.js} +2 -2
  38. package/dist/{data-governance-E7TU342H.js → data-governance-KOGFT4S7.js} +2 -2
  39. package/dist/{deduplication-ONDNRRFQ.js → deduplication-DE6TXT4L.js} +2 -2
  40. package/dist/{deploy-S65VLEDW.js → deploy-QIO5OBK3.js} +2 -2
  41. package/dist/{design-IR7ZW732.js → design-EBV2KQDU.js} +2 -2
  42. package/dist/{dev-M2NFBX7D.js → dev-GPKCQ235.js} +2 -2
  43. package/dist/{document-4QIT2BLE.js → document-NACXRWZH.js} +2 -2
  44. package/dist/{email-settings-QMIVE4TZ.js → email-settings-H6UIZH7L.js} +2 -2
  45. package/dist/{email-template-FCEKKCO7.js → email-template-GIKA6GR7.js} +2 -2
  46. package/dist/{entity-XZ2GMYUG.js → entity-OMS6IABC.js} +2 -2
  47. package/dist/{entity-mapping-AY6ZHAIO.js → entity-mapping-GQHCZ5ZI.js} +2 -2
  48. package/dist/{environments-D4XH27V2.js → environments-HWPY5Z6P.js} +2 -2
  49. package/dist/{event-catalog-WESPPGHG.js → event-catalog-HLSSIACN.js} +2 -2
  50. package/dist/{export-5HRQ4QT3.js → export-VMA6WC4N.js} +2 -2
  51. package/dist/{file-ZCT2IXRP.js → file-7OPR22OK.js} +2 -2
  52. package/dist/{iban-NPS76PCX.js → iban-3YZGMUUW.js} +2 -2
  53. package/dist/{init-TNAKWZQG.js → init-YWQBYKW5.js} +2 -2
  54. package/dist/{integration-toolkit-A4GEB257.js → integration-toolkit-2PWBH4NI.js} +2 -2
  55. package/dist/interactive-LSY5SADM.js +0 -0
  56. package/dist/{journey-7PCPRD3W.js → journey-YKQ2FG5O.js} +2 -2
  57. package/dist/{kanban-E43CECI6.js → kanban-KZE664RW.js} +2 -2
  58. package/dist/{message-TMPN6RJZ.js → message-ONQIUQIW.js} +2 -2
  59. package/dist/{metering-D4XPOXDB.js → metering-V7FQMUJE.js} +2 -2
  60. package/dist/{notes-4VXC6JON.js → notes-5CLFCE52.js} +2 -2
  61. package/dist/{notification-TENO5DZD.js → notification-OCYSAWYH.js} +2 -2
  62. package/dist/{organization-3PMDPR3R.js → organization-EAHPAVSC.js} +2 -2
  63. package/dist/{partner-directory-U5FRVTFO.js → partner-directory-GYQIHOBR.js} +2 -2
  64. package/dist/{permissions-F43YXBFT.js → permissions-C2IKGWW6.js} +2 -2
  65. package/dist/{pricing-23FPHB4H.js → pricing-5V7M6K5J.js} +2 -2
  66. package/dist/{pricing-tier-WNRK7DJT.js → pricing-tier-M4NXMDCT.js} +2 -2
  67. package/dist/profile-OZJL5ZPT.js +0 -0
  68. package/dist/{purpose-ZBJLTVJT.js → purpose-C3MA6SWK.js} +2 -2
  69. package/dist/{query-WNQ4UKSD.js → query-BCF6KCUU.js} +2 -2
  70. package/dist/{remove-component-2RX7KX7Q.js → remove-component-JYA2VHLT.js} +2 -2
  71. package/dist/{review-P6NJWWS2.js → review-2TYWZG5X.js} +2 -2
  72. package/dist/{sandbox-TQ6UHLVS.js → sandbox-TVJU2VZC.js} +2 -2
  73. package/dist/{sharing-TTT7RHZL.js → sharing-PLJI2AHC.js} +2 -2
  74. package/dist/{snapshot-UWO6ZAPD.js → snapshot-XYA4TBKN.js} +2 -2
  75. package/dist/{submission-YAOWAVWS.js → submission-R5COUEWL.js} +2 -2
  76. package/dist/{targeting-G2N36734.js → targeting-A7A3J4RM.js} +2 -2
  77. package/dist/{template-variables-LL72D7RQ.js → template-variables-ZMRZGWUC.js} +2 -2
  78. package/dist/{upgrade-N3I2ICAV.js → upgrade-QM25NNXE.js} +1 -1
  79. package/dist/{user-5BWRFYVG.js → user-6ENHCIWA.js} +2 -2
  80. package/dist/{validate-IIQOIHX2.js → validate-KRX7BUKP.js} +2 -2
  81. package/dist/{validation-rules-BIIHVSDS.js → validation-rules-TM45B7VB.js} +2 -2
  82. package/dist/{versions-IIJLQXCW.js → versions-QINS6BEP.js} +2 -2
  83. package/dist/{webhooks-QQDOTFGH.js → webhooks-4UBUMKJV.js} +2 -2
  84. package/dist/{workflow-6VRK36IL.js → workflow-PYHV6JFL.js} +2 -2
  85. package/dist/{workflow-definition-JZFU47WD.js → workflow-definition-W6KN4MR7.js} +2 -2
  86. package/package.json +13 -12
  87. package/dist/app-UVH3DAFH.js +0 -26
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.0.3",
3
3
  "info": {
4
4
  "title": "Integration Toolkit API",
5
- "version": "1.33.0",
5
+ "version": "1.33.1",
6
6
  "description": "API for integrating with external systems in a standardised way."
7
7
  },
8
8
  "tags": [
@@ -49,6 +49,7 @@
49
49
  "/v1/erp/tracking/acknowledgement": {
50
50
  "post": {
51
51
  "operationId": "acknowledgeTracking",
52
+ "x-epilot-permissions": [],
52
53
  "summary": "acknowledgeTracking",
53
54
  "description": "Acknowledges an ERP tracking record by removing it from the tracking table, requires public authentication",
54
55
  "tags": [
@@ -106,6 +107,11 @@
106
107
  "/v1/erp/trigger": {
107
108
  "post": {
108
109
  "operationId": "triggerErp",
110
+ "x-epilot-permissions": [
111
+ {
112
+ "action": "entity:view"
113
+ }
114
+ ],
109
115
  "summary": "triggerErp",
110
116
  "description": "Triggers the ERP integration process",
111
117
  "tags": [
@@ -142,6 +148,7 @@
142
148
  "post": {
143
149
  "deprecated": true,
144
150
  "operationId": "processErpUpdatesEvents",
151
+ "x-epilot-permissions": [],
145
152
  "summary": "processErpUpdatesEvents",
146
153
  "description": "Handles updates from ERP systems and tracks them appropriately",
147
154
  "tags": [
@@ -237,6 +244,7 @@
237
244
  "post": {
238
245
  "deprecated": true,
239
246
  "operationId": "processErpUpdatesEventsV2",
247
+ "x-epilot-permissions": [],
240
248
  "summary": "processErpUpdatesEventsV2",
241
249
  "description": "Handles updates from ERP systems using integration_id directly.\nThis is the v2 version that simplifies the API by accepting integration_id\ninstead of app_id and component_id.\n",
242
250
  "tags": [
@@ -295,6 +303,7 @@
295
303
  "/v3/erp/updates/events": {
296
304
  "post": {
297
305
  "operationId": "processErpUpdatesEventsV3",
306
+ "x-epilot-permissions": [],
298
307
  "summary": "processErpUpdatesEventsV3",
299
308
  "description": "Handles updates from ERP systems using integration_id directly.\nThis is the v3 version that removes the unused event_type field and renames object_type to event_name\nto align with the integration UI naming.\n",
300
309
  "tags": [
@@ -351,6 +360,7 @@
351
360
  "/v2/erp/updates/mapping_simulation": {
352
361
  "post": {
353
362
  "operationId": "simulateMappingV2",
363
+ "x-epilot-permissions": [],
354
364
  "summary": "simulateMappingV2",
355
365
  "description": "Test v2.0 mapping configuration by transforming a payload using the provided mapping rules without persisting data.\n\nThis endpoint accepts the same configuration format that is stored in the integration use case resource,\nmaking it easier to test configurations before saving them to a use case.\n\nSee documentation at /docs/MAPPING_V2.md for detailed v2.0 format specification.\n",
356
366
  "tags": [
@@ -622,6 +632,7 @@
622
632
  "/v1/erp/updates/direct_simulation": {
623
633
  "post": {
624
634
  "operationId": "simulateDirect",
635
+ "x-epilot-permissions": [],
625
636
  "summary": "simulateDirect",
626
637
  "description": "Dry run for direct-mode payloads: validates a `DirectPayload` against a `direct: true`\nuse case configuration and previews the internal entity and meter reading updates the\npipeline would apply — without persisting anything.\n\nUnlike the ingest endpoint, validation does not stop at the first problem: ALL issues\nacross all operations are collected into `errors`, each carrying the index of the\noperation it refers to. When the payload is valid, the response additionally contains\nthe translated update previews plus non-blocking `warnings` (for example unique-id\nfields that are not defined in the target entity schema, or a failed server-side\nunique-id type derivation).\n\nUse this endpoint while designing a direct integration, before sending events to\n`POST /v3/erp/updates/events`. See documentation at /docs/DIRECT_MODE.md.\n",
627
638
  "tags": [
@@ -783,6 +794,7 @@
783
794
  "/v1/erp/updates/mapping_simulation": {
784
795
  "post": {
785
796
  "operationId": "simulateMapping",
797
+ "x-epilot-permissions": [],
786
798
  "summary": "simulateMapping",
787
799
  "description": "Test mapping configuration by transforming a payload using the provided mapping rules without persisting data.\n\nSupports both v1.0 (object-based) and v2.0 (event-based) mapping formats.\nSee documentation at /docs/MAPPING_V2.md for detailed v2.0 format specification.\n",
788
800
  "tags": [
@@ -1116,6 +1128,11 @@
1116
1128
  "/v1/integrations": {
1117
1129
  "get": {
1118
1130
  "operationId": "listIntegrations",
1131
+ "x-epilot-permissions": [
1132
+ {
1133
+ "action": "integration:view"
1134
+ }
1135
+ ],
1119
1136
  "summary": "listIntegrations",
1120
1137
  "description": "Retrieve all integrations for the authenticated organization",
1121
1138
  "tags": [
@@ -1153,6 +1170,11 @@
1153
1170
  },
1154
1171
  "post": {
1155
1172
  "operationId": "createIntegration",
1173
+ "x-epilot-permissions": [
1174
+ {
1175
+ "action": "integration:manage"
1176
+ }
1177
+ ],
1156
1178
  "summary": "createIntegration",
1157
1179
  "description": "Create a new integration configuration",
1158
1180
  "tags": [
@@ -1194,6 +1216,11 @@
1194
1216
  "/v1/integrations/{integrationId}": {
1195
1217
  "get": {
1196
1218
  "operationId": "getIntegration",
1219
+ "x-epilot-permissions": [
1220
+ {
1221
+ "action": "integration:view"
1222
+ }
1223
+ ],
1197
1224
  "summary": "getIntegration",
1198
1225
  "description": "Retrieve a specific integration by its ID",
1199
1226
  "tags": [
@@ -1235,6 +1262,11 @@
1235
1262
  },
1236
1263
  "put": {
1237
1264
  "operationId": "updateIntegration",
1265
+ "x-epilot-permissions": [
1266
+ {
1267
+ "action": "integration:manage"
1268
+ }
1269
+ ],
1238
1270
  "summary": "updateIntegration",
1239
1271
  "description": "Update an existing integration configuration",
1240
1272
  "tags": [
@@ -1289,6 +1321,11 @@
1289
1321
  },
1290
1322
  "delete": {
1291
1323
  "operationId": "deleteIntegration",
1324
+ "x-epilot-permissions": [
1325
+ {
1326
+ "action": "integration:manage"
1327
+ }
1328
+ ],
1292
1329
  "summary": "deleteIntegration",
1293
1330
  "description": "Delete an integration and all its use cases",
1294
1331
  "tags": [
@@ -1337,6 +1374,11 @@
1337
1374
  "/v1/integrations/{integrationId}/events": {
1338
1375
  "post": {
1339
1376
  "operationId": "queryEvents",
1377
+ "x-epilot-permissions": [
1378
+ {
1379
+ "action": "integration:view"
1380
+ }
1381
+ ],
1340
1382
  "summary": "queryEvents",
1341
1383
  "description": "Query events for a specific integration",
1342
1384
  "tags": [
@@ -1386,6 +1428,11 @@
1386
1428
  "/v1/integrations/{integrationId}/events/replay": {
1387
1429
  "post": {
1388
1430
  "operationId": "replayEvents",
1431
+ "x-epilot-permissions": [
1432
+ {
1433
+ "action": "integration:manage"
1434
+ }
1435
+ ],
1389
1436
  "summary": "replayEvents",
1390
1437
  "description": "Replay one or more events for a specific integration. Events will be re-processed with their original payloads but with a new correlation ID for traceability.",
1391
1438
  "tags": [
@@ -1435,6 +1482,11 @@
1435
1482
  "/v1/integrations/{integrationId}/use-cases": {
1436
1483
  "get": {
1437
1484
  "operationId": "listUseCases",
1485
+ "x-epilot-permissions": [
1486
+ {
1487
+ "action": "integration:view"
1488
+ }
1489
+ ],
1438
1490
  "summary": "listUseCases",
1439
1491
  "description": "Retrieve all use cases for a specific integration",
1440
1492
  "tags": [
@@ -1484,6 +1536,11 @@
1484
1536
  },
1485
1537
  "post": {
1486
1538
  "operationId": "createUseCase",
1539
+ "x-epilot-permissions": [
1540
+ {
1541
+ "action": "integration:manage"
1542
+ }
1543
+ ],
1487
1544
  "summary": "createUseCase",
1488
1545
  "description": "Create a new use case for an integration",
1489
1546
  "tags": [
@@ -1540,6 +1597,11 @@
1540
1597
  "/v1/integrations/{integrationId}/use-cases/{useCaseId}": {
1541
1598
  "get": {
1542
1599
  "operationId": "getUseCase",
1600
+ "x-epilot-permissions": [
1601
+ {
1602
+ "action": "integration:view"
1603
+ }
1604
+ ],
1543
1605
  "summary": "getUseCase",
1544
1606
  "description": "Retrieve a specific use case by its ID",
1545
1607
  "tags": [
@@ -1591,6 +1653,11 @@
1591
1653
  },
1592
1654
  "put": {
1593
1655
  "operationId": "updateUseCase",
1656
+ "x-epilot-permissions": [
1657
+ {
1658
+ "action": "integration:manage"
1659
+ }
1660
+ ],
1594
1661
  "summary": "updateUseCase",
1595
1662
  "description": "Update an existing use case configuration",
1596
1663
  "tags": [
@@ -1655,6 +1722,11 @@
1655
1722
  },
1656
1723
  "delete": {
1657
1724
  "operationId": "deleteUseCase",
1725
+ "x-epilot-permissions": [
1726
+ {
1727
+ "action": "integration:manage"
1728
+ }
1729
+ ],
1658
1730
  "summary": "deleteUseCase",
1659
1731
  "description": "Delete a use case from an integration",
1660
1732
  "tags": [
@@ -1713,6 +1785,11 @@
1713
1785
  "/v1/integrations/{integrationId}/use-cases/{useCaseId}/history": {
1714
1786
  "get": {
1715
1787
  "operationId": "listUseCaseHistory",
1788
+ "x-epilot-permissions": [
1789
+ {
1790
+ "action": "integration:view"
1791
+ }
1792
+ ],
1716
1793
  "summary": "listUseCaseHistory",
1717
1794
  "description": "Retrieve historical versions of a use case's configuration.\nHistory entries are returned in reverse chronological order (newest first).\nUse the 'cursor' parameter for pagination to fetch additional entries.\n",
1718
1795
  "tags": [
@@ -1792,6 +1869,11 @@
1792
1869
  "/v1/integrations/{integrationId}/documentation": {
1793
1870
  "get": {
1794
1871
  "operationId": "listDocumentationPages",
1872
+ "x-epilot-permissions": [
1873
+ {
1874
+ "action": "integration:view"
1875
+ }
1876
+ ],
1795
1877
  "summary": "listDocumentationPages",
1796
1878
  "description": "Retrieve all documentation pages of an integration, without their markdown content.\nAn integration has at most one general page plus at most one page per use case.\nThe page id is 'general' for the integration-wide page, otherwise the use case ID.\n",
1797
1879
  "tags": [
@@ -1846,6 +1928,11 @@
1846
1928
  "/v1/integrations/{integrationId}/documentation/{docId}": {
1847
1929
  "get": {
1848
1930
  "operationId": "getDocumentationPage",
1931
+ "x-epilot-permissions": [
1932
+ {
1933
+ "action": "integration:view"
1934
+ }
1935
+ ],
1849
1936
  "summary": "getDocumentationPage",
1850
1937
  "description": "Retrieve a single documentation page including its markdown content",
1851
1938
  "tags": [
@@ -1897,6 +1984,11 @@
1897
1984
  },
1898
1985
  "put": {
1899
1986
  "operationId": "upsertDocumentationPage",
1987
+ "x-epilot-permissions": [
1988
+ {
1989
+ "action": "integration:manage"
1990
+ }
1991
+ ],
1900
1992
  "summary": "upsertDocumentationPage",
1901
1993
  "description": "Create or update the documentation page identified by docId.\nUpsert semantics enforce the invariant of one general page per\nintegration and one page per use case. For use case pages the\nuse case must exist.\n",
1902
1994
  "tags": [
@@ -1964,6 +2056,11 @@
1964
2056
  },
1965
2057
  "delete": {
1966
2058
  "operationId": "deleteDocumentationPage",
2059
+ "x-epilot-permissions": [
2060
+ {
2061
+ "action": "integration:manage"
2062
+ }
2063
+ ],
1967
2064
  "summary": "deleteDocumentationPage",
1968
2065
  "description": "Delete a documentation page",
1969
2066
  "tags": [
@@ -2025,6 +2122,11 @@
2025
2122
  "/v2/integrations": {
2026
2123
  "get": {
2027
2124
  "operationId": "listIntegrationsV2",
2125
+ "x-epilot-permissions": [
2126
+ {
2127
+ "action": "integration:view"
2128
+ }
2129
+ ],
2028
2130
  "summary": "listIntegrationsV2",
2029
2131
  "description": "Retrieve all integrations with embedded use cases for the authenticated organization",
2030
2132
  "tags": [
@@ -2062,6 +2164,11 @@
2062
2164
  },
2063
2165
  "post": {
2064
2166
  "operationId": "createIntegrationV2",
2167
+ "x-epilot-permissions": [
2168
+ {
2169
+ "action": "integration:manage"
2170
+ }
2171
+ ],
2065
2172
  "summary": "createIntegrationV2",
2066
2173
  "description": "Create a new integration with embedded use cases.\n",
2067
2174
  "tags": [
@@ -2103,6 +2210,11 @@
2103
2210
  "/v2/integrations/{integrationId}": {
2104
2211
  "get": {
2105
2212
  "operationId": "getIntegrationV2",
2213
+ "x-epilot-permissions": [
2214
+ {
2215
+ "action": "integration:view"
2216
+ }
2217
+ ],
2106
2218
  "summary": "getIntegrationV2",
2107
2219
  "description": "Retrieve a specific integration with all its embedded use cases",
2108
2220
  "tags": [
@@ -2144,6 +2256,11 @@
2144
2256
  },
2145
2257
  "put": {
2146
2258
  "operationId": "updateIntegrationV2",
2259
+ "x-epilot-permissions": [
2260
+ {
2261
+ "action": "integration:manage"
2262
+ }
2263
+ ],
2147
2264
  "summary": "updateIntegrationV2",
2148
2265
  "description": "Update an existing integration with embedded use cases.\nThe integration must already exist.\nUse cases are updated declaratively:\n- Use cases in the request with matching IDs are updated\n- Use cases in the request without matching IDs are created\n- Existing use cases not in the request are deleted\n",
2149
2266
  "tags": [
@@ -2198,6 +2315,11 @@
2198
2315
  },
2199
2316
  "delete": {
2200
2317
  "operationId": "deleteIntegrationV2",
2318
+ "x-epilot-permissions": [
2319
+ {
2320
+ "action": "integration:manage"
2321
+ }
2322
+ ],
2201
2323
  "summary": "deleteIntegrationV2",
2202
2324
  "description": "Delete an integration and all its use cases",
2203
2325
  "tags": [
@@ -2246,6 +2368,11 @@
2246
2368
  "/v2/integrations/{integrationId}/notifications/history": {
2247
2369
  "get": {
2248
2370
  "operationId": "listNotificationHistory",
2371
+ "x-epilot-permissions": [
2372
+ {
2373
+ "action": "integration:view"
2374
+ }
2375
+ ],
2249
2376
  "summary": "listNotificationHistory",
2250
2377
  "description": "Returns the cursor-paginated, newest-first notification history for an\nintegration (every real notification decision — both fired and suppressed).\nRequires the `integration:view` permission on the integration's organization.\n",
2251
2378
  "tags": [
@@ -2329,6 +2456,11 @@
2329
2456
  "/v2/integrations/{integrationId}/notifications/test": {
2330
2457
  "post": {
2331
2458
  "operationId": "testSendNotification",
2459
+ "x-epilot-permissions": [
2460
+ {
2461
+ "action": "integration:manage"
2462
+ }
2463
+ ],
2332
2464
  "summary": "testSendNotification",
2333
2465
  "description": "Renders and sends ONE representative notification of the requested kind/type to\nthe CALLING USER ONLY (never any other recipient), so an operator can preview how\na notification looks. A test send does NOT write to the notification history.\nRequires the `integration:manage` permission on the integration's organization.\n",
2334
2466
  "tags": [
@@ -2403,6 +2535,11 @@
2403
2535
  "/v2/integrations/{integrationId}/notifications/status": {
2404
2536
  "get": {
2405
2537
  "operationId": "getNotificationStatus",
2538
+ "x-epilot-permissions": [
2539
+ {
2540
+ "action": "integration:view"
2541
+ }
2542
+ ],
2406
2543
  "summary": "getNotificationStatus",
2407
2544
  "description": "Returns the live per-rule alert state and (for 'auto' rules) the current\nhour-of-week baseline band for an integration's notification monitoring.\nReflects the latest 5-minute sweep — near-real-time, not live.\nRequires the `integration:view` permission on the integration's organization.\n",
2408
2545
  "tags": [
@@ -2469,6 +2606,7 @@
2469
2606
  "/v2/integrations/{integrationId}/use-cases/{useCaseId}/secure-proxy-whitelist": {
2470
2607
  "get": {
2471
2608
  "operationId": "getSecureProxyWhitelist",
2609
+ "x-epilot-permissions": [],
2472
2610
  "summary": "getSecureProxyWhitelist",
2473
2611
  "description": "Returns the current allowed_domains, allowed_ips, and vpc_mode for a secure_proxy use case.\nStaff-only — gated by internal-auth issuer AND admin-portal Cognito user pool membership.\nRejects Login-As tokens.\n",
2474
2612
  "tags": [
@@ -2529,6 +2667,7 @@
2529
2667
  },
2530
2668
  "put": {
2531
2669
  "operationId": "updateSecureProxyWhitelist",
2670
+ "x-epilot-permissions": [],
2532
2671
  "summary": "updateSecureProxyWhitelist",
2533
2672
  "description": "Replaces allowed_domains and/or allowed_ips on a secure_proxy use case.\nAt least one of the two fields is required. Validation mirrors the CLI's\n`validateDomainPatterns` / `validateCidrs`. Writes a USECASE_HISTORY row\nwith the admin user's email as `changed_by`.\n\nUpdate semantics per field:\n - **omitted** — field is not modified; the stored value is preserved.\n - **non-empty array** — the stored value is replaced with the supplied list.\n - **empty array (`[]`)** — the list is cleared (stored as `[]`). This is\n the canonical way to remove all entries. `null` is not accepted.\n\nStaff-only — same auth gates as GET.\n",
2534
2673
  "tags": [
@@ -2601,6 +2740,7 @@
2601
2740
  "/v2/integrations/{integrationId}/use-cases/{useCaseId}/secure-proxy-whitelist/history": {
2602
2741
  "get": {
2603
2742
  "operationId": "listSecureProxyWhitelistHistory",
2743
+ "x-epilot-permissions": [],
2604
2744
  "summary": "listSecureProxyWhitelistHistory",
2605
2745
  "description": "Returns the most recent USECASE_HISTORY entries for a secure_proxy use case,\nin reverse chronological order (newest first). Each entry includes the\nactor email (`changed_by`), the ISO-8601 timestamp (`history_created_at`),\nthe `change_description` (free-text action), and the full `configuration`\nsnapshot — from which UI-08 computes a before/after diff between consecutive\nentries.\n\nStaff-only — gated by internal-auth issuer AND admin-portal Cognito user pool\nmembership. Rejects Login-As tokens (same auth gate as the GET / PUT\nsecure-proxy-whitelist operations).\n\nThin wrapper over the service-layer `listUseCaseHistory` that powers\n`GET /v1/integrations/{integrationId}/use-cases/{useCaseId}/history` — the\nseparate path exists because the /v1 variant is tenant-gated and admin-portal\ninternal-auth tokens do not carry tenant permissions.\n",
2606
2746
  "tags": [
@@ -2690,6 +2830,11 @@
2690
2830
  "/v1/integrations/{integrationId}/app-mapping": {
2691
2831
  "put": {
2692
2832
  "operationId": "setIntegrationAppMapping",
2833
+ "x-epilot-permissions": [
2834
+ {
2835
+ "action": "integration:manage"
2836
+ }
2837
+ ],
2693
2838
  "summary": "setIntegrationAppMapping",
2694
2839
  "description": "Creates or updates a mapping from an app/component to an integration.\nThis allows ERP updates sent via app_id and component_id to be associated\nwith a specific integration configuration.\n",
2695
2840
  "tags": [
@@ -2754,6 +2899,11 @@
2754
2899
  },
2755
2900
  "delete": {
2756
2901
  "operationId": "deleteIntegrationAppMapping",
2902
+ "x-epilot-permissions": [
2903
+ {
2904
+ "action": "integration:manage"
2905
+ }
2906
+ ],
2757
2907
  "summary": "deleteIntegrationAppMapping",
2758
2908
  "description": "Removes a mapping from an app/component to an integration.\n",
2759
2909
  "tags": [
@@ -2815,6 +2965,7 @@
2815
2965
  "/v1/integrations/{integrationId}/monitoring/inbound-events": {
2816
2966
  "post": {
2817
2967
  "operationId": "queryInboundMonitoringEvents",
2968
+ "x-epilot-permissions": [],
2818
2969
  "summary": "queryInboundMonitoringEvents",
2819
2970
  "description": "Query inbound monitoring events for a specific integration.\nReturns detailed information about inbound sync events from ERP systems,\nincluding success rates, error breakdowns, and processing metrics.\n",
2820
2971
  "tags": [
@@ -2865,6 +3016,7 @@
2865
3016
  "/v1/integrations/{integrationId}/monitoring/stats": {
2866
3017
  "post": {
2867
3018
  "operationId": "getMonitoringStats",
3019
+ "x-epilot-permissions": [],
2868
3020
  "summary": "getMonitoringStats",
2869
3021
  "description": "Get aggregated statistics for both inbound and outbound monitoring events for a specific integration.\nReturns summary metrics for inbound (ERP sync) and outbound (webhook delivery) events,\nincluding success/error counts and optional breakdowns.\n",
2870
3022
  "tags": [
@@ -2915,6 +3067,7 @@
2915
3067
  "/v1/integrations/{integrationId}/monitoring/timeseries": {
2916
3068
  "post": {
2917
3069
  "operationId": "getMonitoringTimeSeries",
3070
+ "x-epilot-permissions": [],
2918
3071
  "summary": "getMonitoringTimeSeries",
2919
3072
  "description": "Get time-series aggregated event counts for monitoring charts.\nReturns pre-bucketed counts at configurable intervals for both inbound and outbound events.\nMaximum of 200 buckets per request. Returns 400 if the time range and interval would exceed this limit.\n",
2920
3073
  "tags": [
@@ -2965,6 +3118,7 @@
2965
3118
  "/v1/integrations/{integrationId}/outbound-status": {
2966
3119
  "get": {
2967
3120
  "operationId": "getOutboundStatus",
3121
+ "x-epilot-permissions": [],
2968
3122
  "summary": "getOutboundStatus",
2969
3123
  "description": "Get the status of all outbound use cases for a specific integration.\nReturns conflict information when events or webhooks are disabled but the use case is enabled.\n",
2970
3124
  "tags": [
@@ -3008,6 +3162,7 @@
3008
3162
  "/v1/integrations/entities/{entityId}/sync-status": {
3009
3163
  "get": {
3010
3164
  "operationId": "getEntitySyncStatus",
3165
+ "x-epilot-permissions": [],
3011
3166
  "summary": "getEntitySyncStatus",
3012
3167
  "description": "Get the inbound ERP sync status of an entity: when each integration last\nsynchronized (checked) the entity against the ERP, and when it last\nactually changed it. `last_synced_at` also advances on no-op checks —\nevents that were received and evaluated but changed nothing — which by\ndesign leave no trace on the entity itself (no activity feed entry, no\n`_updated_at` bump). Use it to tell whether an entity is up to date with\nthe ERP. Returns an empty list for entities no inbound use case has\nprocessed. Org-scoped via the caller's token.\n\nDeprecated alias: `GET /v1/entities/{entityId}/sync-status` is still\nserved (rewritten to this path in the API handler) but will be removed —\nmigrate callers to this path.\n",
3013
3168
  "tags": [
@@ -3061,6 +3216,12 @@
3061
3216
  "/v1/integrations/{integrationId}/outbound/messages/poll": {
3062
3217
  "post": {
3063
3218
  "operationId": "pollOutboundMessages",
3219
+ "x-epilot-permissions": [
3220
+ {
3221
+ "action": "integration:consume",
3222
+ "resource": "integration:{integrationId}"
3223
+ }
3224
+ ],
3064
3225
  "summary": "pollOutboundMessages",
3065
3226
  "description": "Poll outbound messages for an integration's poll-mode use cases.\nTakes a lease on the head-of-line batch of the integration's FIFO stream:\nthe returned messages stay invisible to subsequent polls until they are\nacknowledged or the visibility timeout elapses. POST because taking a\nlease mutates server state — auto-retrying middleware must not burn\nleases. One in-flight batch per stream: while a lease is active (or\nanother poll wins the race), the response is an empty batch\n(`messages: []`), not an error. Requires the `integration:consume` grant.\n",
3066
3227
  "tags": [
@@ -3125,6 +3286,12 @@
3125
3286
  "/v1/integrations/{integrationId}/outbound/messages/ack": {
3126
3287
  "post": {
3127
3288
  "operationId": "ackOutboundMessages",
3289
+ "x-epilot-permissions": [
3290
+ {
3291
+ "action": "integration:consume",
3292
+ "resource": "integration:{integrationId}"
3293
+ }
3294
+ ],
3128
3295
  "summary": "ackOutboundMessages",
3129
3296
  "description": "Acknowledge polled outbound messages. Acks are validated against the\nactive lease and committed as a prefix-contiguous cursor advance:\nmessages must be acknowledged in stream order. Out-of-order acks past\nthe first gap are rejected per id (`out_of_order`), acks with an\noutdated lease token are rejected (`stale_lease`), and unknown ids are\nrejected (`not_found`). Acknowledged messages are never delivered\nagain. Requires the `integration:consume` grant.\n",
3130
3297
  "tags": [
@@ -3189,6 +3356,12 @@
3189
3356
  "/v1/integrations/{integrationId}/outbound/messages/dlq": {
3190
3357
  "get": {
3191
3358
  "operationId": "listOutboundDlqMessages",
3359
+ "x-epilot-permissions": [
3360
+ {
3361
+ "action": "integration:manage",
3362
+ "resource": "integration:{integrationId}"
3363
+ }
3364
+ ],
3192
3365
  "summary": "listOutboundDlqMessages",
3193
3366
  "description": "List an integration's dead-lettered outbound queue messages\n(poison_policy enforcement and operator skips move messages here).\nOperator endpoint — requires the `integration:manage` grant. Message\npayloads are NOT included in listings: entries are keyed by the\nopaque message id and carry delivery metadata only. Paginated via an\nopaque `next_token`.\n",
3194
3367
  "tags": [
@@ -3264,6 +3437,12 @@
3264
3437
  "/v1/integrations/{integrationId}/outbound/messages/dlq/redrive": {
3265
3438
  "post": {
3266
3439
  "operationId": "redriveOutboundDlqMessages",
3440
+ "x-epilot-permissions": [
3441
+ {
3442
+ "action": "integration:manage",
3443
+ "resource": "integration:{integrationId}"
3444
+ }
3445
+ ],
3267
3446
  "summary": "redriveOutboundDlqMessages",
3268
3447
  "description": "Redrive selected dead-lettered messages back into the live stream.\nOperator endpoint — requires the `integration:manage` grant.\nA redriven message is re-enqueued at the tail with a new id and\nsequence — it is delivered out of its original per-entity order (the\nstream has moved on); this is inherent to redrive and matches SQS DLQ\nsemantics. The redriven copy starts with zero delivery attempts and a\nfresh retention window; the original DLQ entry is removed. Per-id\nresults report `redriven` or `not_found` (unknown ids, or entries\nconcurrently redriven/expired).\n",
3269
3448
  "tags": [
@@ -3328,6 +3507,12 @@
3328
3507
  "/v1/integrations/{integrationId}/outbound/messages/unblock": {
3329
3508
  "post": {
3330
3509
  "operationId": "unblockOutboundStream",
3510
+ "x-epilot-permissions": [
3511
+ {
3512
+ "action": "integration:manage",
3513
+ "resource": "integration:{integrationId}"
3514
+ }
3515
+ ],
3331
3516
  "summary": "unblockOutboundStream",
3332
3517
  "description": "Unblock an integration's outbound stream halted by the `block`\npoison policy: skips (dead-letters) the current blocked head message,\nemitting MSG_DEAD_LETTERED and letting the next message become the\nhead. Operator endpoint — requires the `integration:manage` grant.\nReturns `unblocked: false` as a no-op when the stream is not\ncurrently blocked (or the state moved concurrently) — safe to retry.\n",
3333
3518
  "tags": [
@@ -3392,6 +3577,7 @@
3392
3577
  "/v1/integrations/{integrationId}/monitoring/access-logs": {
3393
3578
  "post": {
3394
3579
  "operationId": "queryAccessLogs",
3580
+ "x-epilot-permissions": [],
3395
3581
  "summary": "queryAccessLogs",
3396
3582
  "description": "Query API access logs for a specific integration's organization.\nReturns access token usage analytics filtered by user_id (access token).\nSupports infinite scroll pagination with cursor-based navigation.\n",
3397
3583
  "tags": [
@@ -3442,6 +3628,7 @@
3442
3628
  "/v1/integrations/{integrationId}/monitoring/outbound-events": {
3443
3629
  "post": {
3444
3630
  "operationId": "queryOutboundMonitoringEvents",
3631
+ "x-epilot-permissions": [],
3445
3632
  "summary": "queryOutboundMonitoringEvents",
3446
3633
  "description": "Query outbound monitoring events for a specific integration.\nReturns detailed information about outbound event deliveries,\nfiltered by event_name (event_catalog_event) linked to the integration's outbound use cases.\n",
3447
3634
  "tags": [
@@ -3492,6 +3679,7 @@
3492
3679
  "/v2/integrations/{integrationId}/monitoring/events": {
3493
3680
  "post": {
3494
3681
  "operationId": "queryMonitoringEventsV2",
3682
+ "x-epilot-permissions": [],
3495
3683
  "summary": "queryMonitoringEventsV2",
3496
3684
  "description": "Query monitoring events from the unified erp_monitoring_v2 table.\nReturns all event types (inbound, outbound, file_proxy, etc.) in a single list.\nReplaces the separate v1 inbound-events and outbound-events endpoints.\n",
3497
3685
  "tags": [
@@ -3542,6 +3730,7 @@
3542
3730
  "/v2/integrations/{integrationId}/monitoring/stats": {
3543
3731
  "post": {
3544
3732
  "operationId": "getMonitoringStatsV2",
3733
+ "x-epilot-permissions": [],
3545
3734
  "summary": "getMonitoringStatsV2",
3546
3735
  "description": "Get aggregated statistics from the unified erp_monitoring_v2 table.\nReturns combined metrics for all event types with optional breakdowns.\n",
3547
3736
  "tags": [
@@ -3592,6 +3781,7 @@
3592
3781
  "/v2/integrations/{integrationId}/monitoring/time-series": {
3593
3782
  "post": {
3594
3783
  "operationId": "getMonitoringTimeSeriesV2",
3784
+ "x-epilot-permissions": [],
3595
3785
  "summary": "getMonitoringTimeSeriesV2",
3596
3786
  "description": "Get time-series aggregated event counts from the unified erp_monitoring_v2 table.\nReturns bucketed counts for chart rendering.\n",
3597
3787
  "tags": [
@@ -3642,6 +3832,7 @@
3642
3832
  "/v2/integrations/{integrationId}/monitoring/events/{eventId}/associated": {
3643
3833
  "get": {
3644
3834
  "operationId": "getAssociatedMonitoringEvents",
3835
+ "x-epilot-permissions": [],
3645
3836
  "summary": "getAssociatedMonitoringEvents",
3646
3837
  "description": "Returns all monitoring events sharing the same event_id, ordered chronologically.\nAlso includes the original inbound event payload from erp_incoming_events if available.\nUsed to display a full event trace/timeline.\n",
3647
3838
  "tags": [
@@ -3688,6 +3879,11 @@
3688
3879
  "/v2/integrations/{integrationId}/monitoring/external-events": {
3689
3880
  "post": {
3690
3881
  "operationId": "ingestExternalMonitoringEvents",
3882
+ "x-epilot-permissions": [
3883
+ {
3884
+ "action": "integration:manage"
3885
+ }
3886
+ ],
3691
3887
  "summary": "ingestExternalMonitoringEvents",
3692
3888
  "description": "Ingest monitoring spans produced by an EXTERNAL system (e.g. an integration\nmiddleware), so the Integration Hub is the central monitoring point and the\ncross-system event trace spans both the external system and epilot's own\nprocessing.\n\nEach span is validated, assigned a server-controlled `EXTERNAL_*` taxonomy code\nderived from its `level` (the client never supplies a code — this marks\nprovenance and prevents spoofing an epilot code), has its `use_case_slug`\nresolved against the integration's configured use cases, and is republished onto\nthe same monitoring event bus as epilot's own spans — so external spans are\nfirst-class to the trace view, stats, alerting and digests.\n\nSpans link to the epilot trace via `correlation_id` (the trace id): the middleware\nmust stamp the same `correlation_id` here and on the event it forwards to the\ninbound endpoint. Invalid spans in a batch are reported per-item and do not fail\nthe whole batch.\n",
3693
3889
  "tags": [
@@ -3748,6 +3944,11 @@
3748
3944
  "/v2/integrations/{integrationId}/monitoring/traces/{correlationId}": {
3749
3945
  "get": {
3750
3946
  "operationId": "getMonitoringTraceByCorrelation",
3947
+ "x-epilot-permissions": [
3948
+ {
3949
+ "action": "integration:view"
3950
+ }
3951
+ ],
3751
3952
  "summary": "getMonitoringTraceByCorrelation",
3752
3953
  "description": "Returns the cross-system event trace for a `correlation_id`: every monitoring\nspan sharing it — external spans (middleware) plus epilot's own processing spans\n— ordered chronologically, with a rolled-up status and the epilot inbound event\n\"head\" attached. This is the correlation-grouped counterpart to\n`…/events/{eventId}/associated` (which groups a single epilot event's fan-out by\nevent_id). Origin is distinguished by the `EXTERNAL_*` code prefix on external\nspans. Freshness is near-real-time (spans land as they are produced/ingested).\n",
3753
3954
  "tags": [
@@ -3804,6 +4005,11 @@
3804
4005
  "/v1/integrations/secure-proxies": {
3805
4006
  "get": {
3806
4007
  "operationId": "listSecureProxies",
4008
+ "x-epilot-permissions": [
4009
+ {
4010
+ "action": "integration:view"
4011
+ }
4012
+ ],
3807
4013
  "summary": "listSecureProxies",
3808
4014
  "description": "Lists all secure_proxy use cases across all integrations for the authenticated organization.\nReturns minimal data suitable for dropdowns and selection UIs.\n",
3809
4015
  "tags": [
@@ -3848,6 +4054,11 @@
3848
4054
  "/v1/secure-proxy": {
3849
4055
  "post": {
3850
4056
  "operationId": "secureProxy",
4057
+ "x-epilot-permissions": [
4058
+ {
4059
+ "action": "integration:manage"
4060
+ }
4061
+ ],
3851
4062
  "summary": "secureProxy",
3852
4063
  "description": "Routes an HTTP request through a VPC with either static IP egress or VPN secure link access.\nThe VPC mode is determined by the referenced secure_proxy use case configuration.\nFor secure_link mode, the target URL must match the use case's allowed_domains whitelist.\n",
3853
4064
  "tags": [
@@ -3931,6 +4142,11 @@
3931
4142
  "/v1/managed-call/{slug}/execute": {
3932
4143
  "post": {
3933
4144
  "operationId": "managedCallExecute",
4145
+ "x-epilot-permissions": [
4146
+ {
4147
+ "action": "integration:manage"
4148
+ }
4149
+ ],
3934
4150
  "summary": "managedCallExecute",
3935
4151
  "description": "Execute a managed call operation synchronously. The slug in the path acts as the RPC method name.\nCalls an external partner API with JSONata mapping on both request and response.\n",
3936
4152
  "tags": [
@@ -4020,6 +4236,11 @@
4020
4236
  "/v1/integrations/{integrationId}/generate-types-preview": {
4021
4237
  "post": {
4022
4238
  "operationId": "generateTypesPreview",
4239
+ "x-epilot-permissions": [
4240
+ {
4241
+ "action": "integration:manage"
4242
+ }
4243
+ ],
4023
4244
  "summary": "generateTypesPreview",
4024
4245
  "description": "Analyses the JSONata mappings of all managed-call use cases in the integration and returns scaffolded type descriptors. The frontend uses these to show the type editor modal where developers fill in leaf types.\n",
4025
4246
  "tags": [
@@ -4070,6 +4291,11 @@
4070
4291
  "/v1/integrations/{integrationId}/generate-types": {
4071
4292
  "post": {
4072
4293
  "operationId": "generateTypes",
4294
+ "x-epilot-permissions": [
4295
+ {
4296
+ "action": "integration:manage"
4297
+ }
4298
+ ],
4073
4299
  "summary": "generateTypes",
4074
4300
  "description": "Generates a complete TypeScript npm package with typed interfaces for all managed-call use cases. This is a stateless operation that does not persist any changes. Use the commit-types endpoint to lock configurations after review.\n",
4075
4301
  "tags": [
@@ -4130,6 +4356,11 @@
4130
4356
  "/v1/integrations/{integrationId}/commit-types": {
4131
4357
  "post": {
4132
4358
  "operationId": "commitTypes",
4359
+ "x-epilot-permissions": [
4360
+ {
4361
+ "action": "integration:manage"
4362
+ }
4363
+ ],
4133
4364
  "summary": "commitTypes",
4134
4365
  "description": "Commits the generated types by locking use case configurations and updating version tracking. Should be called after the user reviews and downloads the generated package.\n",
4135
4366
  "tags": [
@@ -4190,6 +4421,11 @@
4190
4421
  "/v2/erp/imports": {
4191
4422
  "post": {
4192
4423
  "operationId": "createErpImport",
4424
+ "x-epilot-permissions": [
4425
+ {
4426
+ "action": "integration:manage"
4427
+ }
4428
+ ],
4193
4429
  "summary": "createErpImport",
4194
4430
  "description": "Register an already-uploaded file (S3 ref) as a pricing-file import job. Returns the job and a file preview. Nothing runs yet: no use case is chosen and no validation starts here. Optionally rank candidates with POST /v2/erp/imports/{importId}:suggest-use-cases, then start validation with POST /v2/erp/imports/{importId}:validate.\nPass `import_id` to repoint an existing import at a different file instead, keeping its id and its place in the history — allowed while the import has written nothing.",
4195
4431
  "tags": [
@@ -4253,6 +4489,11 @@
4253
4489
  },
4254
4490
  "get": {
4255
4491
  "operationId": "listErpImports",
4492
+ "x-epilot-permissions": [
4493
+ {
4494
+ "action": "integration:manage"
4495
+ }
4496
+ ],
4256
4497
  "summary": "listErpImports",
4257
4498
  "description": "List recent pricing-file import jobs for the org, newest first.\n\nPass `next_cursor` back as `cursor` for the next page. A page can be\nshorter than `limit` and still have more behind it, so stop on\n`next_cursor: null`.\n",
4258
4499
  "tags": [
@@ -4306,6 +4547,11 @@
4306
4547
  "/v2/erp/imports/{importId}": {
4307
4548
  "get": {
4308
4549
  "operationId": "getErpImport",
4550
+ "x-epilot-permissions": [
4551
+ {
4552
+ "action": "integration:manage"
4553
+ }
4554
+ ],
4309
4555
  "summary": "getErpImport",
4310
4556
  "description": "Get a pricing-file import job (status, counts, result links).",
4311
4557
  "tags": [
@@ -4345,6 +4591,11 @@
4345
4591
  },
4346
4592
  "delete": {
4347
4593
  "operationId": "deleteErpImport",
4594
+ "x-epilot-permissions": [
4595
+ {
4596
+ "action": "integration:manage"
4597
+ }
4598
+ ],
4348
4599
  "summary": "deleteErpImport",
4349
4600
  "description": "Remove an import and the file it owns. Allowed from any status: an import whose run is still in flight is stopped by the deletion, and rows it already wrote stay written.",
4350
4601
  "tags": [
@@ -4379,6 +4630,11 @@
4379
4630
  "/v2/erp/imports/{importId}:validate": {
4380
4631
  "post": {
4381
4632
  "operationId": "validateErpImport",
4633
+ "x-epilot-permissions": [
4634
+ {
4635
+ "action": "integration:manage"
4636
+ }
4637
+ ],
4382
4638
  "summary": "validateErpImport",
4383
4639
  "description": "Choose the use case to read this file with, and start the validate phase.\nCallable from PENDING, READY and FAILED — so a wrong choice is corrected by calling this again with a different use case, rather than re-uploading. Each call replaces any previous verdict. Any other status returns 409.",
4384
4640
  "tags": [
@@ -4443,6 +4699,11 @@
4443
4699
  "/v2/erp/imports/{importId}:suggest-use-cases": {
4444
4700
  "post": {
4445
4701
  "operationId": "suggestErpImportUseCases",
4702
+ "x-epilot-permissions": [
4703
+ {
4704
+ "action": "integration:manage"
4705
+ }
4706
+ ],
4446
4707
  "summary": "suggestErpImportUseCases",
4447
4708
  "description": "Rank the org's inbound use cases against this file's columns — the input to the ranked picker (\"matches 6 of your 7 columns\"). Optional: skip this and call `:validate` directly when the use case is already known. Reads only the file's first row, not its data.\nEvery eligible use case is returned, including ones matching nothing: the \"nothing fits, pick anyway\" view needs the full list. Highest match first.\nCSV only — an xlsx import fails with 400 rather than silently returning zero matches, which would look identical to \"we checked and nothing matches\".",
4448
4709
  "tags": [
@@ -4487,6 +4748,11 @@
4487
4748
  "/v2/erp/imports/{importId}:execute": {
4488
4749
  "post": {
4489
4750
  "operationId": "executeErpImport",
4751
+ "x-epilot-permissions": [
4752
+ {
4753
+ "action": "integration:manage"
4754
+ }
4755
+ ],
4490
4756
  "summary": "executeErpImport",
4491
4757
  "description": "Confirm and run the write phase of a validated import. Only a READY job may be executed; any other status returns 409.\nThe verdict is re-checked against live inputs first: if the mapping or an entity schema changed since the check, this returns 409 `VALIDATION_STALE` and leaves the verdict untouched for `:validate` to re-form.",
4492
4758
  "tags": [
@@ -4558,6 +4824,11 @@
4558
4824
  "/v2/erp/imports/{importId}:abort": {
4559
4825
  "post": {
4560
4826
  "operationId": "abortErpImport",
4827
+ "x-epilot-permissions": [
4828
+ {
4829
+ "action": "integration:manage"
4830
+ }
4831
+ ],
4561
4832
  "summary": "abortErpImport",
4562
4833
  "description": "Ask a running import to stop. Valid while the job is VALIDATING or PROCESSING; any other status returns 409.\nThe stop is cooperative: the job passes through CANCELLING and typically reaches CANCELLED within seconds.\nRows already published to the platform are **kept**: this is a stop, not a rollback. Aborting during VALIDATING has published nothing, so it is always clean; aborting during PROCESSING leaves a partial import, and the rows that landed are visible in monitoring under the job's correlation_id.",
4563
4834
  "tags": [