@celigo/api-specs 0.2.24 → 0.2.26

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.
@@ -721,7 +721,9 @@ components:
721
721
  description: |-
722
722
  Job ID of the flow run that processed the functional acknowledgement
723
723
  (997 / CONTRL) for this transaction. Present only once an FA has been
724
- received and processed.
724
+ received and processed. Use this job — not `_flowJobId` — with
725
+ `POST /v1/jobs/{_faFlowJobId}/files/signedURL` (body
726
+ `{ "fileIds": ["<faS3Key>"] }`) to download the FA file.
725
727
  x-celigo-refModel: jobs
726
728
  examples:
727
729
  - 6a05fdbf0f139ef519238dd7
@@ -806,8 +808,13 @@ components:
806
808
  Opaque file identifier for the stored functional-acknowledgement
807
809
  (997 / CONTRL) file. Present only once an FA has been received.
808
810
  One acknowledgement file can cover many transactions, which then
809
- share the same `faS3Key`. Download it via
810
- `GET /v1/ediTransactions/{_ediTransactionId}/ediFile?type=fa`.
811
+ share the same `faS3Key`. To download the FA file, combine with
812
+ `_faFlowJobId` (the FA-processing flow run — not `_flowJobId`) and
813
+ call `POST /v1/jobs/{_faFlowJobId}/files/signedURL` with body
814
+ `{ "fileIds": ["<faS3Key>"] }`. For parsed FA failure details, use
815
+ `GET /v1/ediTransactions/{_ediTransactionId}/faDetails?fileType=<X12|EDIFACT>`
816
+ — pass the transaction's own `fileType`; the route answers 404 without it
817
+ (available only for transactions with a rejected FA status).
811
818
  examples:
812
819
  - 9a7c3e14b2af45d8bc0e6090c5be6afa
813
820
  mdnStatus:
package/dist/enduser.yml CHANGED
@@ -21,7 +21,9 @@ tags:
21
21
  getting workspace access — they sign in through MCP OAuth, optionally
22
22
  via an external IdP. Use these endpoints to invite end users (singly or
23
23
  in bulk), list and revoke them, and inspect the effective MCP tool
24
- access compiled from their grants, groups, and roles.
24
+ access compiled from their grants, groups, and roles. An end user's
25
+ access record is an ashare, so editing its grants and suspending it
26
+ use the `/v1/ashares` routes shared with workspace users.
25
27
 
26
28
  ## End user schema
27
29
 
@@ -325,6 +327,131 @@ paths:
325
327
  $ref: '#/components/responses/403-forbidden'
326
328
  '404':
327
329
  $ref: '#/components/responses/404-not-found'
330
+ /v1/ashares/{_ashareId}:
331
+ put:
332
+ x-internal: false
333
+ summary: Update an end user's access
334
+ operationId: updateEndUser
335
+ tags:
336
+ - End Users
337
+ description: |-
338
+ Replaces the end user's group memberships and direct resource grants with
339
+ the arrays sent. Works on invited end users before they accept. `disabled`
340
+ is not applied here — use `PUT /v1/ashares/{_ashareId}/disable`.
341
+
342
+ An end user's access record is an ashare, so this is the same route as
343
+ the workspace-user update in the Users API, with this body instead of the
344
+ workspace fields. `GET /v1/ashares/{_id}` does not return end-user
345
+ records — read them from `GET /v1/endusers`.
346
+ parameters:
347
+ - name: _ashareId
348
+ in: path
349
+ required: true
350
+ description: End-user access-record id (from the end users list).
351
+ schema:
352
+ type: string
353
+ format: objectId
354
+ requestBody:
355
+ required: true
356
+ content:
357
+ application/json:
358
+ schema:
359
+ $ref: '#/components/schemas/EndUserUpdateRequest'
360
+ examples:
361
+ removeDirectGrant:
362
+ summary: Keep one group, drop a direct grant
363
+ value:
364
+ groupMemberships:
365
+ - _groupId: 68a1b2c3d4e5f6a7b8c9d0e1
366
+ source: manual
367
+ resourceGrants: []
368
+ grantServer:
369
+ summary: Add a direct grant on one MCP server
370
+ value:
371
+ groupMemberships: []
372
+ resourceGrants:
373
+ - resourceType: mcpServer
374
+ _resourceId: 6a1b2c3d4e5f6a7b8c9d0e1f
375
+ capabilities:
376
+ - tool:all
377
+ responses:
378
+ '200':
379
+ description: |-
380
+ The updated access record as stored. The identity fields the list
381
+ joins in (`email`, `name`, `lastSignIn`) and `hasWorkspaceShare` are
382
+ not included, and empty arrays may be omitted.
383
+ content:
384
+ application/json:
385
+ schema:
386
+ $ref: '#/components/schemas/EndUser'
387
+ examples:
388
+ default:
389
+ value:
390
+ _id: 68b1c2d3e4f5a6b7c8d9e0f1
391
+ _sharedWithUserId: 624774a6a7574d3ed9f9a5cc
392
+ userType: end-user
393
+ provisionedBy: invite
394
+ accepted: true
395
+ groupMemberships:
396
+ - _groupId: 68a1b2c3d4e5f6a7b8c9d0e1
397
+ source: manual
398
+ createdAt: '2026-07-01T09:15:32Z'
399
+ lastModified: '2026-08-15T14:30:15Z'
400
+ '400':
401
+ $ref: '#/components/responses/400-bad-request'
402
+ '401':
403
+ $ref: '#/components/responses/401-unauthorized'
404
+ '404':
405
+ $ref: '#/components/responses/404-not-found'
406
+ /v1/ashares/{_ashareId}/disable:
407
+ put:
408
+ x-internal: false
409
+ summary: Toggle an end user's access
410
+ operationId: toggleEndUserDisabled
411
+ tags:
412
+ - End Users
413
+ description: |-
414
+ Toggles the `disabled` flag on the end user's access record — call again
415
+ to restore access; there is no separate `/enable` path. Unlike the
416
+ workspace toggle, this also works on invited end users who have not yet
417
+ accepted. Shares its route with the workspace-user toggle in the Users
418
+ API.
419
+ parameters:
420
+ - name: _ashareId
421
+ in: path
422
+ required: true
423
+ description: End-user access-record id (from the end users list).
424
+ schema:
425
+ type: string
426
+ format: objectId
427
+ requestBody:
428
+ required: false
429
+ content:
430
+ application/json:
431
+ schema:
432
+ type: object
433
+ description: Empty body — the target is identified by the path parameter alone.
434
+ examples:
435
+ default:
436
+ summary: Empty body
437
+ value: {}
438
+ responses:
439
+ '204':
440
+ description: End-user access toggled.
441
+ '401':
442
+ $ref: '#/components/responses/401-unauthorized'
443
+ '404':
444
+ description: End user not found.
445
+ content:
446
+ application/json:
447
+ schema:
448
+ $ref: '#/components/schemas/Error'
449
+ examples:
450
+ ashare_not_found:
451
+ value:
452
+ errors:
453
+ - code: invalid_ref
454
+ message: AShare not found.
328
455
  /v1/groups:
329
456
  get:
330
457
  x-internal: false
@@ -1010,7 +1137,10 @@ components:
1010
1137
  description: When true, the end user has declined the invitation.
1011
1138
  disabled:
1012
1139
  type: boolean
1013
- description: When true, the end user's access is suspended without deleting the record.
1140
+ description: |-
1141
+ When true, the end user's access is suspended without deleting the
1142
+ record. Changed only by `PUT /v1/ashares/{_ashareId}/disable` — a
1143
+ value sent on the update operation is not applied.
1014
1144
  groupMemberships:
1015
1145
  type: array
1016
1146
  description: Groups this end user belongs to, with the source of each membership.
@@ -1418,6 +1548,25 @@ components:
1418
1548
  reason:
1419
1549
  type: string
1420
1550
  description: Why the tool is not available to this end user.
1551
+ EndUserUpdateRequest:
1552
+ type: object
1553
+ description: |-
1554
+ Replacement access for an end user. Both arrays are stored as sent, so
1555
+ each must carry every entry to keep, not just the changes.
1556
+ required:
1557
+ - groupMemberships
1558
+ - resourceGrants
1559
+ properties:
1560
+ groupMemberships:
1561
+ type: array
1562
+ description: Complete set of groups the end user should belong to after the update.
1563
+ items:
1564
+ $ref: '#/components/schemas/GroupMembership'
1565
+ resourceGrants:
1566
+ type: array
1567
+ description: Complete set of direct resource grants the end user should hold after the update.
1568
+ items:
1569
+ $ref: '#/components/schemas/ResourceGrant'
1421
1570
  Group:
1422
1571
  type: object
1423
1572
  description: |-
@@ -18,6 +18,7 @@ info:
18
18
  - Supports tool overrides for customizing connections, exports, imports, and routing per-server
19
19
  - Exposes prompts via `prompts/list` and `prompts/get` with Handlebars-style argument substitution
20
20
  - Carries **permission sets** ("Capability Sets" in the UI) — named bundles of its tools and APIs granted to end users via `pset:<_id>` capability strings on end-user, group, and role resource grants
21
+ - Carries optional **traffic limits** (`policies[]`) — a server-level rate limit, a per-user rate limit for OAuth end users, and a usage quota — enforced before a tool runs; a rejected call gets HTTP 429 with `Retry-After`
21
22
  servers:
22
23
  - url: https://api.integrator.io
23
24
  description: Production (US / default region)
@@ -43,7 +44,10 @@ tags:
43
44
  and routing. Permission sets ("Capability Sets" in the UI) bundle a
44
45
  server's tools and APIs into named grants for end users, and the
45
46
  server-scoped access endpoints bulk-assign capabilities to end users
46
- and groups and report compiled effective access.
47
+ and groups and report compiled effective access. Optional traffic
48
+ limits (`policies`) — a server-level rate limit, a per-user rate
49
+ limit, and a usage quota — reject calls over the limit with HTTP 429
50
+ and `Retry-After` before any tool runs.
47
51
 
48
52
  ## MCP server schema
49
53
 
@@ -269,10 +273,11 @@ paths:
269
273
  summary: Update an MCP server
270
274
  description: |-
271
275
  Full replacement of an MCP server's configuration. Omitted arrays
272
- (`tools`, `apis`, `prompts`, `resources`, `permissionSets`) are cleared,
273
- so include the complete arrays — clearing `permissionSets` this way also
274
- rewrites the `pset:` grants that referenced the erased sets. `relativeURI`
275
- can be changed but must remain unique per account.
276
+ (`tools`, `apis`, `prompts`, `resources`, `permissionSets`, `policies`)
277
+ are cleared, so include the complete arrays — clearing `permissionSets`
278
+ this way also rewrites the `pset:` grants that referenced the erased sets,
279
+ and clearing `policies` removes every traffic limit. `relativeURI` can be
280
+ changed but must remain unique per account.
276
281
  operationId: updateMcpServer
277
282
  tags:
278
283
  - MCP Servers
@@ -386,8 +391,14 @@ paths:
386
391
  summary: Patch an MCP server
387
392
  description: |-
388
393
  Partially updates an MCP server using a JSON Patch document (RFC 6902).
389
- Only `/name` and `/disabled` are whitelisted paths — all other paths
390
- are rejected with `not a whitelisted property`.
394
+ Only `/name`, `/disabled`, and `/policies` are whitelisted paths — all
395
+ other paths are rejected with `not a whitelisted property`. Under
396
+ `/policies`, `add`, `replace`, and `remove` work on the whole array,
397
+ `add` works at `/policies/-` or an index, and `replace` works at an index
398
+ or a sub-path such as `/policies/0/config/limit`; `remove` at an array
399
+ index is rejected with 422 `Remove at array index is not supported`. The
400
+ resulting array is validated as a whole, and an invalid policy rejects
401
+ the entire patch.
391
402
  operationId: patchMcpServer
392
403
  tags:
393
404
  - MCP Servers
@@ -421,6 +432,40 @@ paths:
421
432
  - op: replace
422
433
  path: /name
423
434
  value: Updated Server Name
435
+ set_traffic_limits:
436
+ summary: Set a server rate limit, a per-user rate limit, and a monthly quota
437
+ value:
438
+ - op: replace
439
+ path: /policies
440
+ value:
441
+ - type: rate-limit
442
+ name: Server-level rate limit
443
+ enabled: true
444
+ config:
445
+ limit: 600
446
+ periodTime: 1
447
+ periodTimeUnit: MINUTE
448
+ - type: rate-limit
449
+ name: Per-user rate limit
450
+ enabled: true
451
+ config:
452
+ limit: 60
453
+ periodTime: 1
454
+ periodTimeUnit: MINUTE
455
+ keyResolver: consumer
456
+ - type: quota
457
+ name: Monthly usage quota
458
+ enabled: true
459
+ config:
460
+ limit: 500000
461
+ periodTime: 1
462
+ periodTimeUnit: MONTH
463
+ remove_traffic_limits:
464
+ summary: Remove every traffic limit (unlimited)
465
+ value:
466
+ - op: replace
467
+ path: /policies
468
+ value: []
424
469
  responses:
425
470
  '204':
426
471
  description: Patch applied.
@@ -1724,6 +1769,217 @@ components:
1724
1769
  required:
1725
1770
  - name
1726
1771
  - accessLevel
1772
+ Policy:
1773
+ type: object
1774
+ description: |-
1775
+ One traffic limit the server enforces before a tool runs — shown under
1776
+ **Access > Governance** in the UI. A `rate-limit` caps calls per MINUTE,
1777
+ HOUR, or DAY with a continuously refilling allowance, either for the whole
1778
+ server (`keyResolver` `endpoint`) or separately for each OAuth end user
1779
+ (`keyResolver` `consumer`); a `quota` caps cumulative calls over a UTC
1780
+ calendar DAY, WEEK, or MONTH across every consumer. A call must pass every
1781
+ enabled policy. A rejected call is not executed and receives HTTP 429 with
1782
+ a `Retry-After` header (seconds until the allowance refills or the quota
1783
+ period resets), an `X-RateLimit-Limit` header, and a JSON-RPC error
1784
+ (code -32004) whose message names the policy: `Rate limit exceeded: <name>`
1785
+ or `Usage quota exceeded: <name>`.
1786
+ x-celigo-ai-guidance:
1787
+ - |-
1788
+ Configure one policy per kind — one server-level rate limit, one per-user
1789
+ rate limit (`keyResolver` `consumer`), one quota. The API does not reject a
1790
+ second policy of the same kind; both are then enforced against the same
1791
+ traffic, which makes the effective limit hard to reason about.
1792
+ - |-
1793
+ A `tools/call` counts against every enabled policy, even when the named tool
1794
+ does not exist; `initialize`, `tools/list`, `prompts/list`, and `resources/list`
1795
+ are never counted or rejected (all live-verified). Whether `prompts/get` and
1796
+ `resources/read` count has not been verified — do not assert either way.
1797
+ - |-
1798
+ Bearer API-token traffic is evaluated by `endpoint`-keyed rate limits and by
1799
+ quotas only; a `consumer`-keyed rate limit applies to OAuth end users, each
1800
+ with an independent allowance, and leaves API-token traffic untouched.
1801
+ - |-
1802
+ A rate limit keeps its allowance state when its `limit` is changed, so raising
1803
+ a limit right after it tripped admits nothing until tokens refill at the new
1804
+ rate. A quota counts every call the server accepted in the current UTC period,
1805
+ including calls made before the quota was configured — a quota below the
1806
+ period's current count rejects every call until the period resets.
1807
+ required:
1808
+ - type
1809
+ - name
1810
+ - config
1811
+ properties:
1812
+ type:
1813
+ type: string
1814
+ enum:
1815
+ - rate-limit
1816
+ - quota
1817
+ x-enumDescriptions:
1818
+ rate-limit: Caps calls per MINUTE, HOUR, or DAY with an allowance that refills continuously; server-wide, or per end user with keyResolver consumer
1819
+ quota: Caps cumulative calls over a UTC calendar DAY, WEEK, or MONTH for every consumer combined
1820
+ description: |-
1821
+ Kind of limit. Use rate-limit to protect downstream systems from bursts
1822
+ and, with `keyResolver` `consumer`, to keep one end user from consuming
1823
+ the whole server; use quota to cap total consumption for cost control.
1824
+ examples:
1825
+ - rate-limit
1826
+ name:
1827
+ type: string
1828
+ maxLength: 100
1829
+ description: |-
1830
+ Label for the limit, echoed verbatim in the 429 error message that
1831
+ rejected clients receive — name it the way consumers should read it.
1832
+ examples:
1833
+ - Server-level rate limit
1834
+ - Per-user rate limit
1835
+ - Monthly usage quota
1836
+ enabled:
1837
+ type: boolean
1838
+ default: true
1839
+ description: |-
1840
+ When true, the policy is enforced. Set to false to keep the
1841
+ configuration in place without enforcing it.
1842
+ examples:
1843
+ - true
1844
+ config:
1845
+ type: object
1846
+ additionalProperties: false
1847
+ description: |-
1848
+ Limit value and period. The maximum `limit` depends on the unit and
1849
+ equals the platform ceiling of 300 calls per second over one period.
1850
+ required:
1851
+ - limit
1852
+ - periodTime
1853
+ - periodTimeUnit
1854
+ properties:
1855
+ limit:
1856
+ type: integer
1857
+ minimum: 1
1858
+ description: |-
1859
+ Maximum number of counted calls in one period. Ceilings per unit:
1860
+ 18000 per MINUTE, 1080000 per HOUR, 25920000 per DAY, 181440000 per
1861
+ WEEK, 777600000 per MONTH — higher values are rejected with 422
1862
+ `policy_config_invalid`.
1863
+ examples:
1864
+ - 600
1865
+ periodTime:
1866
+ type: integer
1867
+ const: 1
1868
+ default: 1
1869
+ description: |-
1870
+ Number of `periodTimeUnit` units in one period. Only a single unit
1871
+ is supported; any other value is rejected with 422.
1872
+ examples:
1873
+ - 1
1874
+ periodTimeUnit:
1875
+ type: string
1876
+ enum:
1877
+ - MINUTE
1878
+ - HOUR
1879
+ - DAY
1880
+ - WEEK
1881
+ - MONTH
1882
+ x-enumDescriptions:
1883
+ MINUTE: One-minute period; rate limits only
1884
+ HOUR: One-hour period; rate limits only
1885
+ DAY: One calendar day (UTC) for quotas, or a one-day refilling allowance for rate limits
1886
+ WEEK: One calendar week (UTC); quotas only
1887
+ MONTH: One calendar month (UTC); quotas only
1888
+ description: |-
1889
+ Length of one period. Rate limits take MINUTE, HOUR, or DAY; quotas
1890
+ take DAY, WEEK, or MONTH — any other pairing, or a lowercase value,
1891
+ is rejected with 422 `policy_config_invalid`.
1892
+ examples:
1893
+ - MINUTE
1894
+ keyResolver:
1895
+ type: string
1896
+ enum:
1897
+ - endpoint
1898
+ - consumer
1899
+ default: endpoint
1900
+ x-enumDescriptions:
1901
+ endpoint: One shared allowance for the whole server across every consumer and authentication method
1902
+ consumer: A separate allowance for each OAuth end user; bearer API-token traffic is not evaluated by this policy
1903
+ description: |-
1904
+ Whose allowance the limit tracks. Omit it (or send endpoint) for a
1905
+ server-level limit and send consumer for a per-user rate limit;
1906
+ quotas accept endpoint only.
1907
+ examples:
1908
+ - endpoint
1909
+ if:
1910
+ properties:
1911
+ periodTimeUnit:
1912
+ const: MINUTE
1913
+ required:
1914
+ - periodTimeUnit
1915
+ then:
1916
+ properties:
1917
+ limit:
1918
+ maximum: 18000
1919
+ else:
1920
+ if:
1921
+ properties:
1922
+ periodTimeUnit:
1923
+ const: HOUR
1924
+ required:
1925
+ - periodTimeUnit
1926
+ then:
1927
+ properties:
1928
+ limit:
1929
+ maximum: 1080000
1930
+ else:
1931
+ if:
1932
+ properties:
1933
+ periodTimeUnit:
1934
+ const: DAY
1935
+ required:
1936
+ - periodTimeUnit
1937
+ then:
1938
+ properties:
1939
+ limit:
1940
+ maximum: 25920000
1941
+ else:
1942
+ if:
1943
+ properties:
1944
+ periodTimeUnit:
1945
+ const: WEEK
1946
+ required:
1947
+ - periodTimeUnit
1948
+ then:
1949
+ properties:
1950
+ limit:
1951
+ maximum: 181440000
1952
+ else:
1953
+ properties:
1954
+ limit:
1955
+ maximum: 777600000
1956
+ if:
1957
+ properties:
1958
+ type:
1959
+ const: rate-limit
1960
+ required:
1961
+ - type
1962
+ then:
1963
+ properties:
1964
+ config:
1965
+ properties:
1966
+ periodTimeUnit:
1967
+ enum:
1968
+ - MINUTE
1969
+ - HOUR
1970
+ - DAY
1971
+ else:
1972
+ properties:
1973
+ config:
1974
+ properties:
1975
+ periodTimeUnit:
1976
+ enum:
1977
+ - DAY
1978
+ - WEEK
1979
+ - MONTH
1980
+ keyResolver:
1981
+ enum:
1982
+ - endpoint
1727
1983
  OAuthConfig:
1728
1984
  type: object
1729
1985
  description: |-
@@ -1965,12 +2221,28 @@ components:
1965
2221
  `resources`, the field is not normalized to an empty array).
1966
2222
  x-celigo-ai-guidance:
1967
2223
  - |-
1968
- Not editable via PATCH (the whitelist covers only `/name` and
1969
- `/disabled`). To change permission sets safely, GET the server,
2224
+ Not editable via PATCH (the whitelist covers only `/name`,
2225
+ `/disabled`, and `/policies`). To change permission sets safely, GET the server,
1970
2226
  modify `permissionSets`, and PUT the complete document back with
1971
2227
  every set's `_id` intact.
1972
2228
  items:
1973
2229
  $ref: '#/components/schemas/PermissionSet'
2230
+ policies:
2231
+ type: array
2232
+ description: |-
2233
+ Traffic limits enforced on this server before a tool runs — a
2234
+ server-level rate limit, a per-user rate limit, and a usage quota, each
2235
+ optional and independent. An empty array (the default) means unlimited.
2236
+ Always returned; servers saved before traffic limits existed return an
2237
+ empty array. Omitting the field on PUT clears every limit — send the
2238
+ complete array back, or edit it with PATCH.
2239
+ x-celigo-ai-guidance:
2240
+ - |-
2241
+ Leave `policies` empty unless the user asks for a limit — that is today's
2242
+ default behavior. To change limits without touching the rest of the
2243
+ document, PATCH `replace /policies` with the complete array.
2244
+ items:
2245
+ $ref: '#/components/schemas/Policy'
1974
2246
  oauth:
1975
2247
  $ref: '#/components/schemas/OAuthConfig'
1976
2248
  ResourceResponse:
@@ -2065,9 +2337,9 @@ components:
2065
2337
  type: object
2066
2338
  description: |-
2067
2339
  Request body for creating or updating an MCP server. On PUT, include
2068
- the full `tools`, `apis`, and `resources` arrays because omitted arrays
2069
- are cleared. Use PATCH to update individual fields without affecting
2070
- these arrays.
2340
+ the full `tools`, `apis`, `prompts`, `resources`, `permissionSets`, and
2341
+ `policies` arrays because omitted arrays are cleared. Use PATCH to update individual
2342
+ fields without affecting these arrays.
2071
2343
  x-celigo-ai-guidance:
2072
2344
  - |-
2073
2345
  MCP servers expose Celigo tools, builder-mode APIs,
@@ -1396,12 +1396,22 @@ components:
1396
1396
  `preConfiguredFields` must include a `type` path (e.g. `ftp` or
1397
1397
  `as2`) and export/import must include `file.type` set to
1398
1398
  `filedefinition` -- these are validated when `published` is `true`.
1399
+
1400
+ `type`, `region`, and `model` must match the deployment's configured
1401
+ values exactly, including case. A value outside the list is not
1402
+ rejected with a validation error: the request never completes (no
1403
+ response is returned) and nothing is created or changed.
1399
1404
  x-celigo-ai-guidance:
1400
1405
  - |-
1401
1406
  Trading partner connectors define reusable templates for onboarding EDI trading partners.
1402
1407
  They specify which fields are pre-configured and which fields the user must
1403
1408
  provide for connections,
1404
1409
  exports, imports, and EDI profiles.
1410
+ - |-
1411
+ Send `type`, `region`, and `model` exactly as configured (`AS2`, not `as2`;
1412
+ `North America`; `Dropship`). An out-of-list value gets no response at all — the
1413
+ create or update never completes and nothing is saved — so a request that hangs
1414
+ on this endpoint means a categorization value is wrong, not that the platform is slow.
1405
1415
  - |-
1406
1416
  When `published` is true, the connector's `supportedBy` sections are validated
1407
1417
  to ensure all required fields are present. For example:
package/dist/user.yml CHANGED
@@ -125,7 +125,10 @@ paths:
125
125
  operationId: getUser
126
126
  tags:
127
127
  - Users
128
- description: Retrieve a single user's access record by its id.
128
+ description: |-
129
+ Retrieve a single user's access record by its id. Returns workspace
130
+ records only — an end-user access-record id is not found here; read
131
+ those from `GET /v1/endusers`.
129
132
  parameters:
130
133
  - name: _id
131
134
  in: path
@@ -173,10 +176,17 @@ paths:
173
176
  tags:
174
177
  - Users
175
178
  description: |-
176
- Update a user's access level, integration permissions, or account
177
- settings. The user's email cannot be changed after invite. To
178
- disable a user without deleting, use `PUT /v1/ashares/{_id}/disable`
179
- instead.
179
+ Replaces a workspace user's access settings. The body must grant access
180
+ through `accessLevel` or a non-empty `integrationAccessLevel`, and
181
+ `integrationAccessLevel`, `accountSSORequired`, and `accountMFARequired`
182
+ are cleared when omitted — send every value to keep. `disabled` is not
183
+ applied here; toggle it with `PUT /v1/ashares/{_userId}/disable`.
184
+ Read-only fields echoed from the GET response are ignored, except
185
+ `userType`, which is rejected. The user's email cannot be changed after
186
+ invite. Callable from the production environment only.
187
+
188
+ End-user access records share this route with a different body — see
189
+ the End Users API.
180
190
  parameters:
181
191
  - name: _id
182
192
  in: path
@@ -193,30 +203,81 @@ paths:
193
203
  $ref: '#/components/schemas/Request'
194
204
  examples:
195
205
  changeAccessLevel:
196
- summary: Change to administrator
206
+ summary: Change to administrator (resend the SSO/MFA settings — omitted ones are cleared)
197
207
  value:
198
208
  accessLevel: administrator
209
+ integrationAccessLevel: []
210
+ accountSSORequired: false
211
+ accountMFARequired: true
199
212
  integrationOnly:
200
- summary: Integration-only access
213
+ summary: Integration-only access (no accessLevel; resend the SSO/MFA settings)
201
214
  value:
202
215
  integrationAccessLevel:
203
216
  - _integrationId: 68f52162f00a35a1b26eaafb
204
217
  accessLevel: manage
205
218
  - _integrationId: 6842261335b64c0bcb308e4f
206
219
  accessLevel: monitor
207
- disableUser:
208
- summary: Re-enable a disabled user
220
+ accountSSORequired: false
221
+ accountMFARequired: true
222
+ keepSettings:
223
+ summary: Change access level, keeping every other setting
209
224
  value:
210
- disabled: false
225
+ accessLevel: monitor
226
+ integrationAccessLevel: []
227
+ accountSSORequired: false
228
+ accountMFARequired: true
229
+ allowToEditRetryData: true
211
230
  responses:
212
231
  '204':
213
232
  description: User updated.
214
233
  '400':
215
- $ref: '#/components/responses/400-bad-request'
234
+ description: The body grants no access, or echoes the read-only `userType`.
235
+ content:
236
+ application/json:
237
+ schema:
238
+ $ref: '#/components/schemas/Error'
239
+ examples:
240
+ noAccessGranted:
241
+ summary: Neither accessLevel nor integrationAccessLevel sent
242
+ value:
243
+ errors:
244
+ - code: invalid_request
245
+ message: To update the account access you need to either provide account level access or integration level access.
246
+ userTypeEchoed:
247
+ summary: Read-only userType sent back
248
+ value:
249
+ errors:
250
+ - code: validation_failed
251
+ message: userType is immutable after creation.
216
252
  '401':
217
253
  $ref: '#/components/responses/401-unauthorized'
254
+ '403':
255
+ description: The call was made from a sandbox environment.
256
+ content:
257
+ application/json:
258
+ schema:
259
+ $ref: '#/components/schemas/Error'
260
+ examples:
261
+ sandboxEnvironment:
262
+ value:
263
+ errors:
264
+ - code: access_restricted
265
+ message: This request can only be made through the production environment.
218
266
  '404':
219
267
  $ref: '#/components/responses/404-not-found'
268
+ '422':
269
+ description: '`integrationAccessLevel` is empty and no `accessLevel` was sent.'
270
+ content:
271
+ application/json:
272
+ schema:
273
+ $ref: '#/components/schemas/Error'
274
+ examples:
275
+ emptyIntegrationAccess:
276
+ value:
277
+ errors:
278
+ - code: missing_required_field
279
+ field: accessLevel
280
+ message: You need to provide user with either an account level access or integration level access.
220
281
  delete:
221
282
  x-internal: false
222
283
  summary: Delete a user
@@ -251,8 +312,12 @@ paths:
251
312
  summary: Toggle a user's account access (disable or re-enable)
252
313
  description: |-
253
314
  Toggles the `disabled` flag on a user's access record. Call again to
254
- re-enable — there is no separate `/enable` path. Only works on users
255
- with `accepted: true`.
315
+ re-enable — there is no separate `/enable` path, and this is the only
316
+ way to change `disabled` (the update operation does not apply it). A
317
+ pending invitation cannot be toggled until the invited user accepts or
318
+ declines it.
319
+
320
+ End-user access records share this route — see the End Users API.
256
321
  parameters:
257
322
  - name: _userId
258
323
  in: path
@@ -278,7 +343,17 @@ paths:
278
343
  '204':
279
344
  description: User access toggled.
280
345
  '400':
281
- $ref: '#/components/responses/400-bad-request'
346
+ description: The invitation is still pending.
347
+ content:
348
+ application/json:
349
+ schema:
350
+ $ref: '#/components/schemas/Error'
351
+ examples:
352
+ pendingInvitation:
353
+ value:
354
+ errors:
355
+ - code: invalid_request
356
+ message: You can't disable this invitation without it being accepted or dismissed by the invited user.
282
357
  '401':
283
358
  $ref: '#/components/responses/401-unauthorized'
284
359
  '404':
@@ -435,9 +510,6 @@ components:
435
510
  type: object
436
511
  description: Writable fields shared by the request and response schemas.
437
512
  properties:
438
- disabled:
439
- type: boolean
440
- description: Set to False to enable a disabled user, or True to maintain disabled
441
513
  accessLevel:
442
514
  type: string
443
515
  description: |-
@@ -452,8 +524,14 @@ components:
452
524
  `integrationAccessLevel` undefined/empty
453
525
 
454
526
  If per-integration level permissions are needed, omit `accessLevel` and instead populate `integrationAccessLevel`.
527
+
528
+ On update (`PUT /v1/ashares/{_id}`) the body replaces the access settings: `integrationAccessLevel`,
529
+ `accountSSORequired`, and `accountMFARequired` are cleared when omitted, so resend every value to keep.
455
530
  x-celigo-ai-guidance:
456
531
  - Choose the `accessLevel` value based on what the user should be able to do across the account.
532
+ - |-
533
+ On PUT, "omit" means "clear" for integrationAccessLevel, accountSSORequired, and
534
+ accountMFARequired — GET the record first and resend those three with the new accessLevel.
457
535
  enum:
458
536
  - monitor
459
537
  - manage
@@ -472,6 +550,8 @@ components:
472
550
  - If `accessLevel` is omitted, this creates **integration-only** access.
473
551
  - If `accessLevel` is `monitor`, this grants **elevated access** (typically `manage`) for specific integrations.
474
552
  - If `accessLevel` is `manage` or `administrator`, do not set `integrationAccessLevel`.
553
+
554
+ Cleared when omitted on update — send `[]` explicitly only when you mean no per-integration grants.
475
555
  items:
476
556
  type: object
477
557
  properties:
@@ -493,12 +573,16 @@ components:
493
573
  manage: Full access to edit the integration and its resources.
494
574
  accountSSORequired:
495
575
  type: boolean
496
- description: When true, SSO is required for this user in this account.
576
+ description: |-
577
+ When true, SSO is required for this user in this account. Cleared when
578
+ omitted on update — resend it with every `PUT /v1/ashares/{_id}`.
497
579
  x-celigo-ai-guidance:
498
580
  - Whether the invited user must use SSO to access this account.
499
581
  accountMFARequired:
500
582
  type: boolean
501
- description: When true, MFA is required for this user in this account.
583
+ description: |-
584
+ When true, MFA is required for this user in this account. Cleared when
585
+ omitted on update — resend it with every `PUT /v1/ashares/{_id}`.
502
586
  x-celigo-ai-guidance:
503
587
  - Whether the invited user must use MFA to access this account.
504
588
  allowAccessToAPIM:
@@ -601,6 +685,13 @@ components:
601
685
  type: boolean
602
686
  readOnly: true
603
687
  description: When true, the user has accepted the invitation to join the account.
688
+ disabled:
689
+ type: boolean
690
+ readOnly: true
691
+ description: |-
692
+ When true, the user's access to the account is suspended. Changed
693
+ only by `PUT /v1/ashares/{_userId}/disable` — a value sent on the
694
+ update operation is accepted but not applied.
604
695
  userType:
605
696
  type: string
606
697
  readOnly: true
@@ -608,8 +699,10 @@ components:
608
699
  - workspace
609
700
  description: |-
610
701
  Discriminates workspace users from end users on the underlying
611
- access-record model. This endpoint only returns `workspace`
612
- records — end users are managed through the End Users API.
702
+ access-record model. Reads on this API return only `workspace`
703
+ records — end users are managed through the End Users API, which
704
+ shares the update and disable routes. Sending it back on update
705
+ is rejected.
613
706
  x-enumDescriptions:
614
707
  workspace: A workspace (team member) access record.
615
708
  lastSignIn:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celigo/api-specs",
3
- "version": "0.2.24",
3
+ "version": "0.2.26",
4
4
  "private": false,
5
5
  "description": "Public OpenAPI bundles (dist/) and the celigo-cli lint schema pack (schemas.json).",
6
6
  "keywords": [
package/schemas.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "provenance": {
3
3
  "repo": "celigo/integrator-api-specs",
4
- "iasCommit": "9257926",
4
+ "iasCommit": "641fc30",
5
5
  "generatedAt": "2026-09-18"
6
6
  },
7
7
  "roots": {
@@ -20,11 +20,11 @@
20
20
  "integration": 642,
21
21
  "lookupcache": 644,
22
22
  "mcpoauthprovider": 648,
23
- "mcpserver": 679,
24
- "script": 680,
25
- "stack": 687,
26
- "sync": 697,
27
- "tool": 714
23
+ "mcpserver": 685,
24
+ "script": 686,
25
+ "stack": 693,
26
+ "sync": 703,
27
+ "tool": 720
28
28
  },
29
29
  "defs": [
30
30
  {
@@ -7879,8 +7879,9 @@
7879
7879
  "description": 1,
7880
7880
  "disabled": 9,
7881
7881
  "name": 1,
7882
- "oauth": 678,
7882
+ "oauth": 684,
7883
7883
  "permissionSets": 677,
7884
+ "policies": 683,
7884
7885
  "prompts": 674,
7885
7886
  "relativeURI": 1,
7886
7887
  "resources": 666,
@@ -8154,6 +8155,64 @@
8154
8155
  ],
8155
8156
  "i": 675
8156
8157
  },
8158
+ {
8159
+ "t": [
8160
+ "object"
8161
+ ],
8162
+ "p": {
8163
+ "config": 682,
8164
+ "enabled": 9,
8165
+ "name": 1,
8166
+ "type": 679
8167
+ }
8168
+ },
8169
+ {
8170
+ "t": [
8171
+ "string"
8172
+ ],
8173
+ "e": [
8174
+ "quota",
8175
+ "rate-limit"
8176
+ ]
8177
+ },
8178
+ {
8179
+ "t": [
8180
+ "string"
8181
+ ],
8182
+ "e": [
8183
+ "DAY",
8184
+ "HOUR",
8185
+ "MINUTE",
8186
+ "MONTH",
8187
+ "WEEK"
8188
+ ]
8189
+ },
8190
+ {
8191
+ "t": [
8192
+ "string"
8193
+ ],
8194
+ "e": [
8195
+ "consumer",
8196
+ "endpoint"
8197
+ ]
8198
+ },
8199
+ {
8200
+ "t": [
8201
+ "object"
8202
+ ],
8203
+ "p": {
8204
+ "keyResolver": 681,
8205
+ "limit": 124,
8206
+ "periodTime": 124,
8207
+ "periodTimeUnit": 680
8208
+ }
8209
+ },
8210
+ {
8211
+ "t": [
8212
+ "array"
8213
+ ],
8214
+ "i": 678
8215
+ },
8157
8216
  {
8158
8217
  "t": [
8159
8218
  "object"
@@ -8184,8 +8243,9 @@
8184
8243
  "draftExpiresAt": 1,
8185
8244
  "lastModified": 1,
8186
8245
  "name": 1,
8187
- "oauth": 678,
8246
+ "oauth": 684,
8188
8247
  "permissionSets": 677,
8248
+ "policies": 683,
8189
8249
  "prompts": 674,
8190
8250
  "relativeURI": 1,
8191
8251
  "resources": 666,
@@ -8270,9 +8330,9 @@
8270
8330
  ],
8271
8331
  "p": {
8272
8332
  "accessKeyId": 1,
8273
- "awsRegion": 684,
8333
+ "awsRegion": 690,
8274
8334
  "functionName": 1,
8275
- "language": 685,
8335
+ "language": 691,
8276
8336
  "secretAccessKey": 1
8277
8337
  }
8278
8338
  },
@@ -8283,12 +8343,12 @@
8283
8343
  "p": {
8284
8344
  "_id": 1,
8285
8345
  "createdAt": 1,
8286
- "framework": 682,
8287
- "lambda": 686,
8346
+ "framework": 688,
8347
+ "lambda": 692,
8288
8348
  "lastModified": 1,
8289
8349
  "name": 1,
8290
- "server": 683,
8291
- "type": 681
8350
+ "server": 689,
8351
+ "type": 687
8292
8352
  }
8293
8353
  },
8294
8354
  {
@@ -8315,8 +8375,8 @@
8315
8375
  "object"
8316
8376
  ],
8317
8377
  "p": {
8318
- "dataset": 693,
8319
- "element": 694
8378
+ "dataset": 699,
8379
+ "element": 700
8320
8380
  }
8321
8381
  },
8322
8382
  {
@@ -8341,8 +8401,8 @@
8341
8401
  "object"
8342
8402
  ],
8343
8403
  "p": {
8344
- "added": 691,
8345
- "removed": 692
8404
+ "added": 697,
8405
+ "removed": 698
8346
8406
  }
8347
8407
  },
8348
8408
  {
@@ -8350,12 +8410,12 @@
8350
8410
  "object"
8351
8411
  ],
8352
8412
  "p": {
8353
- "added": 691,
8354
- "arrayAdded": 696,
8355
- "expanded": 692,
8356
- "objectAdded": 695,
8357
- "reduced": 692,
8358
- "removed": 692
8413
+ "added": 697,
8414
+ "arrayAdded": 702,
8415
+ "expanded": 698,
8416
+ "objectAdded": 701,
8417
+ "reduced": 698,
8418
+ "removed": 698
8359
8419
  }
8360
8420
  },
8361
8421
  {
@@ -8385,13 +8445,13 @@
8385
8445
  "_integrationId": 1,
8386
8446
  "_userId": 1,
8387
8447
  "description": 1,
8388
- "destination": 689,
8448
+ "destination": 695,
8389
8449
  "disabled": 9,
8390
- "driftPolicy": 690,
8450
+ "driftPolicy": 696,
8391
8451
  "historicDateTime": 1,
8392
8452
  "name": 1,
8393
8453
  "schedule": 1,
8394
- "source": 688,
8454
+ "source": 694,
8395
8455
  "timezone": 1
8396
8456
  }
8397
8457
  },
@@ -8404,10 +8464,10 @@
8404
8464
  "aiDescription": 131,
8405
8465
  "description": 1,
8406
8466
  "draft": 9,
8407
- "input": 699,
8467
+ "input": 705,
8408
8468
  "name": 1,
8409
- "output": 707,
8410
- "routers": 713
8469
+ "output": 713,
8470
+ "routers": 719
8411
8471
  }
8412
8472
  },
8413
8473
  {
@@ -8420,7 +8480,7 @@
8420
8480
  "mockInput": 10,
8421
8481
  "name": 1,
8422
8482
  "schema": 10,
8423
- "transform": 700
8483
+ "transform": 706
8424
8484
  }
8425
8485
  },
8426
8486
  {
@@ -8428,7 +8488,7 @@
8428
8488
  "object"
8429
8489
  ],
8430
8490
  "p": {
8431
- "expression": 706,
8491
+ "expression": 712,
8432
8492
  "script": 109,
8433
8493
  "type": 104
8434
8494
  }
@@ -8437,14 +8497,14 @@
8437
8497
  "t": [
8438
8498
  "array"
8439
8499
  ],
8440
- "i": 702
8500
+ "i": 708
8441
8501
  },
8442
8502
  {
8443
8503
  "t": [
8444
8504
  "object"
8445
8505
  ],
8446
8506
  "p": {
8447
- "buildArrayHelper": 704,
8507
+ "buildArrayHelper": 710,
8448
8508
  "conditional": 96,
8449
8509
  "dataType": 87,
8450
8510
  "default": 88,
@@ -8456,7 +8516,7 @@
8456
8516
  "generateDateFormat": 1,
8457
8517
  "generateDateTimezone": 1,
8458
8518
  "lookupName": 1,
8459
- "mappings": 701,
8519
+ "mappings": 707,
8460
8520
  "sourceDataType": 87,
8461
8521
  "status": 94
8462
8522
  }
@@ -8469,7 +8529,7 @@
8469
8529
  "conditional": 91,
8470
8530
  "default": 88,
8471
8531
  "extract": 1,
8472
- "mappings": 701,
8532
+ "mappings": 707,
8473
8533
  "sourceDataType": 87
8474
8534
  }
8475
8535
  },
@@ -8477,7 +8537,7 @@
8477
8537
  "t": [
8478
8538
  "array"
8479
8539
  ],
8480
- "i": 703
8540
+ "i": 709
8481
8541
  },
8482
8542
  {
8483
8543
  "t": [
@@ -8486,7 +8546,7 @@
8486
8546
  "p": {
8487
8547
  "inputContext": 102,
8488
8548
  "lookups": 116,
8489
- "mappings": 701,
8549
+ "mappings": 707,
8490
8550
  "mode": 115
8491
8551
  }
8492
8552
  },
@@ -8496,7 +8556,7 @@
8496
8556
  ],
8497
8557
  "p": {
8498
8558
  "rules": 114,
8499
- "rulesTwoDotZero": 705,
8559
+ "rulesTwoDotZero": 711,
8500
8560
  "version": 111
8501
8561
  }
8502
8562
  },
@@ -8508,8 +8568,8 @@
8508
8568
  "debugUntil": 1,
8509
8569
  "description": 1,
8510
8570
  "hooks": 196,
8511
- "lookups": 709,
8512
- "mappings": 701,
8571
+ "lookups": 715,
8572
+ "mappings": 707,
8513
8573
  "mockInput": 10,
8514
8574
  "name": 1,
8515
8575
  "schema": 10
@@ -8530,14 +8590,14 @@
8530
8590
  "t": [
8531
8591
  "array"
8532
8592
  ],
8533
- "i": 708
8593
+ "i": 714
8534
8594
  },
8535
8595
  {
8536
8596
  "t": [
8537
8597
  "object"
8538
8598
  ],
8539
8599
  "p": {
8540
- "branches": 712,
8600
+ "branches": 718,
8541
8601
  "id": 1,
8542
8602
  "name": 1,
8543
8603
  "routeRecordsTo": 172,
@@ -8562,13 +8622,13 @@
8562
8622
  "t": [
8563
8623
  "array"
8564
8624
  ],
8565
- "i": 711
8625
+ "i": 717
8566
8626
  },
8567
8627
  {
8568
8628
  "t": [
8569
8629
  "array"
8570
8630
  ],
8571
- "i": 710
8631
+ "i": 716
8572
8632
  },
8573
8633
  {
8574
8634
  "t": [
@@ -8584,11 +8644,11 @@
8584
8644
  "description": 1,
8585
8645
  "draft": 9,
8586
8646
  "draftExpiresAt": 1,
8587
- "input": 699,
8647
+ "input": 705,
8588
8648
  "lastModified": 1,
8589
8649
  "name": 1,
8590
- "output": 707,
8591
- "routers": 713
8650
+ "output": 713,
8651
+ "routers": 719
8592
8652
  }
8593
8653
  }
8594
8654
  ]