@celigo/api-specs 0.2.172 → 0.2.174

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.
package/dist/import.yml CHANGED
@@ -12617,7 +12617,9 @@ components:
12617
12617
  x-celigo-refModel: scripts
12618
12618
  description: |
12619
12619
  Reference to the Script resource that contains the filtering logic. This must be a valid
12620
- ObjectId of a Script resource that exists in the system.
12620
+ ObjectId of a Script resource in this account: any other id fails the save with 422
12621
+ ("Only a script owned by the user or a script shared by the Integration App can be used
12622
+ at filter.script._scriptId.").
12621
12623
 
12622
12624
  The referenced script must contain the function specified in the `function` field
12623
12625
  and must be written to handle filtering specifically. The script receives
@@ -12676,7 +12678,11 @@ components:
12676
12678
  type: string
12677
12679
  format: objectId
12678
12680
  x-celigo-refModel: scripts
12679
- description: Script containing the hook function named in `function`. Send this or `_stackId`, not both.
12681
+ description: |-
12682
+ Script containing the hook function named in `function`. Send this or `_stackId`, not both.
12683
+ Must be a script in this account: any other id fails the save with 422, naming the hook,
12684
+ such as "Only a script owned by the user or a script shared by the Integration App can
12685
+ be used at hooks.preMap._scriptId." on an import's `preMap`.
12680
12686
  _stackId:
12681
12687
  type: string
12682
12688
  format: objectId
@@ -15249,7 +15255,9 @@ components:
15249
15255
  Reference to a predefined script resource containing the transformation logic.
15250
15256
 
15251
15257
  The referenced script should contain the function specified in the
15252
- 'function' property.
15258
+ 'function' property. It must be a script in this account: any other id fails the save
15259
+ with 422 ("Only a script owned by the user or a script shared by the Integration App can
15260
+ be used at transform.script._scriptId.").
15253
15261
  format: objectid
15254
15262
  x-celigo-refModel: scripts
15255
15263
  examples:
@@ -16872,6 +16880,15 @@ components:
16872
16880
  plus whatever this step's response mapping merges back. A value later steps need
16873
16881
  belongs in the source export's `preSavePage`, in this step's `postResponseMap` hook on
16874
16882
  the flow, or in the later import's own `preMap`.
16883
+
16884
+ The function returns one element per record in `options.data`, in order:
16885
+ `{ data: <record> }` sends the record and `{ errors: [{ code, message }] }` fails it.
16886
+ An element without `data` — `{}`, or the record itself returned unwrapped — skips that
16887
+ record with no error: nothing is sent and the record is reported `ignored: true` at
16888
+ stage `preMapHook`. A return with more or fewer elements fails every record on the page
16889
+ with `invalid_extension_response` ("Extension result doesn't contain the same number
16890
+ of elements as the request object. Expected 2, got 1. Extension returned statusCode
16891
+ 200"), source `pre_map_hook`.
16875
16892
  x-celigo-ai-guidance:
16876
16893
  - |-
16877
16894
  Pre-map JavaScript hook — runs once per page BEFORE the
@@ -16883,7 +16900,18 @@ components:
16883
16900
  renames — mappings handle those.
16884
16901
 
16885
16902
  Runtime contract: ``options.data[]`` (the page of upstream
16886
- records) → array of the same length.
16903
+ records) → array of the same length, each element
16904
+ ``{data: record}`` or ``{errors: [...]}``. A bare record in
16905
+ the returned array is skipped without an error, so
16906
+ ``options.data.map(r => { r.total = t; return r })`` sends
16907
+ nothing.
16908
+ - |-
16909
+ Verified live 2026-10-22 by invoking an HTTP import with a
16910
+ Mapper 2.0 number mapping: one ``{data: record}`` per record
16911
+ sent both records; the bare records sent nothing and both
16912
+ came back ``ignored: true``, ``stage: preMapHook``, with no
16913
+ error; one element for two records failed both with 422
16914
+ ``invalid_extension_response``.
16887
16915
  allOf:
16888
16916
  - $ref: '#/components/schemas/Hook'
16889
16917
  postMap:
@@ -17745,6 +17773,18 @@ components:
17745
17773
  example:
17746
17774
  5f7c579b6411271af4e7cefa: 64a1234567890abcdef12345
17747
17775
  5f7c579b6411271af4e7cefb: 64a1234567890abcdef12346
17776
+ _stackId:
17777
+ type: string
17778
+ format: objectId
17779
+ x-celigo-refModel: stacks
17780
+ description: |-
17781
+ Stack that every stack reference in the cloned resources (hooks and wrapper
17782
+ connections running on a stack) points at. Required when the clone preview reports
17783
+ `stackRequired: true`: without it the clone fails with 400 `stack_not_found`. The
17784
+ stack must belong to the target environment or be shared with it (404
17785
+ `stack_not_found` for an unknown id, 400 `invalid_stack` otherwise).
17786
+ examples:
17787
+ - 5f8d43a1b9e5a80011a35f2c
17748
17788
  additionalProperties: true
17749
17789
  CloneResponse:
17750
17790
  description: Response body for a clone operation. Some clone endpoints return the cloned resource, while others may return a list of related created resources.
@@ -17795,12 +17835,18 @@ components:
17795
17835
  additionalProperties: true
17796
17836
  stackRequired:
17797
17837
  type: boolean
17798
- description: Whether the clone requires a stack (connector-level) environment to proceed.
17838
+ description: |-
17839
+ `true` when the resource or one of its dependencies references a stack (a hook or
17840
+ wrapper connection that runs on a stack). Send `_stackId` in the clone request: without
17841
+ it the clone fails with 400 `stack_not_found`.
17799
17842
  _stackId:
17800
17843
  type:
17801
17844
  - string
17802
17845
  - 'null'
17803
- description: The stack id associated with the resource, or null if no stack is involved.
17846
+ description: |-
17847
+ The first stack the resource or a dependency references, or null. Pass it, or another
17848
+ stack in the target environment, as `_stackId` in the clone request; the clone points
17849
+ every stack reference at that one stack.
17804
17850
  examples:
17805
17851
  - 5f8d43a1b9e5a80011a35f2c
17806
17852
  ImportRecordResult:
@@ -4609,6 +4609,18 @@ components:
4609
4609
  example:
4610
4610
  5f7c579b6411271af4e7cefa: 64a1234567890abcdef12345
4611
4611
  5f7c579b6411271af4e7cefb: 64a1234567890abcdef12346
4612
+ _stackId:
4613
+ type: string
4614
+ format: objectId
4615
+ x-celigo-refModel: stacks
4616
+ description: |-
4617
+ Stack that every stack reference in the cloned resources (hooks and wrapper
4618
+ connections running on a stack) points at. Required when the clone preview reports
4619
+ `stackRequired: true`: without it the clone fails with 400 `stack_not_found`. The
4620
+ stack must belong to the target environment or be shared with it (404
4621
+ `stack_not_found` for an unknown id, 400 `invalid_stack` otherwise).
4622
+ examples:
4623
+ - 5f8d43a1b9e5a80011a35f2c
4612
4624
  additionalProperties: true
4613
4625
  CloneResponse:
4614
4626
  description: Response body for a clone operation. Some clone endpoints return the cloned resource, while others may return a list of related created resources.
@@ -4669,12 +4681,18 @@ components:
4669
4681
  additionalProperties: true
4670
4682
  stackRequired:
4671
4683
  type: boolean
4672
- description: Whether the clone requires a stack (connector-level) environment to proceed.
4684
+ description: |-
4685
+ `true` when the resource or one of its dependencies references a stack (a hook or
4686
+ wrapper connection that runs on a stack). Send `_stackId` in the clone request: without
4687
+ it the clone fails with 400 `stack_not_found`.
4673
4688
  _stackId:
4674
4689
  type:
4675
4690
  - string
4676
4691
  - 'null'
4677
- description: The stack id associated with the resource, or null if no stack is involved.
4692
+ description: |-
4693
+ The first stack the resource or a dependency references, or null. Pass it, or another
4694
+ stack in the target environment, as `_stackId` in the clone request; the clone points
4695
+ every stack reference at that one stack.
4678
4696
  examples:
4679
4697
  - 5f8d43a1b9e5a80011a35f2c
4680
4698
  Revision:
@@ -452,12 +452,14 @@ paths:
452
452
  strings, or objects — arrays at the top level are rejected (wrap them in an
453
453
  object). One invalid entry fails the entire batch and nothing in it is written:
454
454
  a bad value returns `400 invalid_value`, an empty, missing, or over-length
455
- key returns `400 cache_dynamodb_invalid_key`, and a key that appears twice in
456
- the batch returns 400 "Duplicate keys found in the request".
455
+ key, or one holding a tab, newline, carriage return or NUL, returns
456
+ `400 cache_dynamodb_invalid_key`, and a key that appears twice in the batch
457
+ returns 400 "Duplicate keys found in the request".
457
458
 
458
- The service rejects batches larger than ~1000 entries or ~5 MB of JSON.
459
- Callers uploading more than that should split their payload; the Celigo CLI
460
- auto-batches at 1000 entries / 5 MB and concatenates the per-key results.
459
+ One request takes at most 1000 entries, each entry at most 64 KB, and at most 5 MB of
460
+ JSON in all (413, "request entity too large!"). Callers uploading more than that should
461
+ split their payload; the Celigo CLI auto-batches at 1000 entries / 5 MB and concatenates
462
+ the per-key results.
461
463
  Each cache is capped at 50 MB and the per-environment aggregate is 1 GB.
462
464
  parameters:
463
465
  - name: _id
@@ -511,6 +513,17 @@ paths:
511
513
  $ref: '#/components/responses/401-unauthorized'
512
514
  '404':
513
515
  $ref: '#/components/responses/404-not-found'
516
+ '413':
517
+ description: The request body is over 5 MB of JSON. Split the batch.
518
+ content:
519
+ application/json:
520
+ schema:
521
+ $ref: '#/components/schemas/Error'
522
+ examples:
523
+ too_large:
524
+ value:
525
+ errors:
526
+ - message: request entity too large!
514
527
  delete:
515
528
  x-internal: false
516
529
  operationId: deleteLookupCacheDataKeys
@@ -1009,12 +1022,18 @@ components:
1009
1022
  additionalProperties: true
1010
1023
  stackRequired:
1011
1024
  type: boolean
1012
- description: Whether the clone requires a stack (connector-level) environment to proceed.
1025
+ description: |-
1026
+ `true` when the resource or one of its dependencies references a stack (a hook or
1027
+ wrapper connection that runs on a stack). Send `_stackId` in the clone request: without
1028
+ it the clone fails with 400 `stack_not_found`.
1013
1029
  _stackId:
1014
1030
  type:
1015
1031
  - string
1016
1032
  - 'null'
1017
- description: The stack id associated with the resource, or null if no stack is involved.
1033
+ description: |-
1034
+ The first stack the resource or a dependency references, or null. Pass it, or another
1035
+ stack in the target environment, as `_stackId` in the clone request; the clone points
1036
+ every stack reference at that one stack.
1018
1037
  examples:
1019
1038
  - 5f8d43a1b9e5a80011a35f2c
1020
1039
  LookupCacheDataEntry:
@@ -1034,7 +1053,8 @@ components:
1034
1053
  description: |-
1035
1054
  Lookup key. Treated as an opaque string by the cache — case-sensitive, no
1036
1055
  normalization. The same cache can hold multiple entries that differ only in
1037
- case (e.g. `CA` and `ca`).
1056
+ case (e.g. `CA` and `ca`). An upsert also refuses a key that holds a tab, a newline,
1057
+ a carriage return or a NUL character, with the same `cache_dynamodb_invalid_key`.
1038
1058
  examples:
1039
1059
  - CA
1040
1060
  - ext-customer-12345
@@ -1071,9 +1091,9 @@ components:
1071
1091
  Request body for upserting key-value entries into a lookup cache. `data` must be
1072
1092
  a non-empty array. Keys already present are overwritten; new keys are created.
1073
1093
 
1074
- The service rejects batches larger than ~1000 entries or ~5 MB — callers inserting
1075
- more than that should split into multiple requests (the Celigo CLI auto-batches
1076
- at 1000 entries / 5 MB).
1094
+ One request takes at most 1000 entries, each entry at most 64 KB, and at most 5 MB of
1095
+ JSON in all (413) — callers inserting more than that should split into multiple
1096
+ requests (the Celigo CLI auto-batches at 1000 entries / 5 MB).
1077
1097
  properties:
1078
1098
  data:
1079
1099
  type: array
@@ -154,9 +154,17 @@ paths:
154
154
  `type` tells you which install route to use afterwards:
155
155
  `POST /v1/integrations/template/{_id}` for `integration`,
156
156
  `POST /v1/mcpservers/template/{_templateId}` for `mcpserver`.
157
- `stackRequired` is `true` when the template includes NetSuite-distributed
158
- resources that need a dedicated stack — the installer prompts for one
159
- before the install proceeds.
157
+ `stackRequired` is `true` when the template has hooks or wrapper
158
+ connections that run on a stack: the marketplace installer prompts for
159
+ one; `POST /v1/integrations/template/{_id}`, for a template it accepts
160
+ (no `template_zip` install step), needs it as `_stackId`; and an
161
+ MCP-server template's install adds a stack step to the integration it
162
+ creates.
163
+
164
+ Previewing an MCP-server template needs the same install permission as
165
+ installing it (403 for a monitor or integration-level user whose access
166
+ doesn't allow creating integrations); an integration template's preview
167
+ needs none.
160
168
 
161
169
  The ID must belong to a Template, not a Connector (Integration App).
162
170
  Connector IDs from `/v1/published` return 404 here -- pull template
@@ -234,6 +242,14 @@ paths:
234
242
  concurrencyLevel: 1
235
243
  '401':
236
244
  $ref: '#/components/responses/401-unauthorized'
245
+ '403':
246
+ description: |-
247
+ An MCP-server template previewed by a user who may not install templates (a monitor
248
+ or integration-level user whose access doesn't allow creating integrations).
249
+ content:
250
+ application/json:
251
+ schema:
252
+ $ref: '#/components/schemas/Error'
237
253
  '404':
238
254
  description: |-
239
255
  No template matched the id. Most commonly: the id belongs to a
@@ -887,10 +903,15 @@ components:
887
903
  stackRequired:
888
904
  type: boolean
889
905
  description: |-
890
- `true` when the template includes NetSuite-distributed resources
891
- that need a dedicated stack — the installer prompts for one before
892
- the install proceeds. `false` for Shopify / HTTP / file-only
893
- templates.
906
+ `true` when the template has an export or import hook, or a wrapper
907
+ connection, that runs on a stack (a function with no script). The
908
+ marketplace installer asks for the stack. Through the API, an
909
+ integration template that `POST /v1/integrations/template/{_id}`
910
+ accepts (no `template_zip` install step) needs `_stackId` in the body,
911
+ or the install fails with 400 `stack_not_found`; so does a zip
912
+ installed with `POST /v1/integrations/template`. An MCP-server
913
+ template's install takes no body: the integration it creates for a
914
+ tool-bearing template gets a stack install step instead.
894
915
  responses:
895
916
  401-unauthorized:
896
917
  description: |-
@@ -329,15 +329,22 @@ components:
329
329
  - https://mcp.example.com
330
330
  scopes:
331
331
  type: array
332
- description: Required OAuth scopes. Incoming tokens must carry every listed scope.
332
+ description: |-
333
+ The MCP operations OAuth callers may use on every server that references this
334
+ provider, and the scopes those servers advertise as `scopes_supported`. Calling a
335
+ tool (`tools/call`) needs `mcp:write`; listing tools, prompts and resources, and
336
+ reading prompts and resources, accept either scope. Listing only `mcp:read` refuses
337
+ every tool call with 403 `insufficient_scope`, whatever the token carries; an empty
338
+ list allows both. Each request also needs its scope in the caller's token, so a
339
+ token issued with only `mcp:read` can list and read but can't call a tool.
333
340
  items:
334
341
  type: string
335
342
  enum:
336
343
  - mcp:read
337
344
  - mcp:write
338
345
  x-enumDescriptions:
339
- mcp:read: Grants read-only access to MCP server resources.
340
- mcp:write: Grants write access to MCP server resources.
346
+ mcp:read: Lists tools, prompts and resources and reads prompts and resources; can't call a tool.
347
+ mcp:write: Calls tools (`tools/call`); also lists and reads.
341
348
  examples:
342
349
  - - mcp:read
343
350
  - mcp:write
@@ -3082,7 +3082,15 @@ components:
3082
3082
  scopes:
3083
3083
  type: array
3084
3084
  description: |-
3085
- Required OAuth scopes. Incoming tokens must carry every listed scope.
3085
+ For an external provider or inline OAuth: the MCP operations OAuth callers may use on
3086
+ this server, and the scopes its OAuth metadata advertises as `scopes_supported`.
3087
+ Calling a tool (`tools/call`) needs `mcp:write`; listing tools, prompts and resources,
3088
+ and reading prompts and resources, accept either scope. A server that lists only
3089
+ `mcp:read` refuses every tool call with 403 `insufficient_scope`, whatever the token
3090
+ carries; an empty list allows both. Under Celigo OAuth (`useCeligoOauth`) this list
3091
+ isn't used: the server allows both scopes. Either way each request also needs its
3092
+ scope in the caller's token, so a token issued with only `mcp:read` can list and read
3093
+ but can't call a tool. API-token callers aren't scope-checked.
3086
3094
 
3087
3095
  Rejected values return `enum` / `invalid_field_value` on
3088
3096
  `oauth.scopes.<index>`.
@@ -3092,8 +3100,8 @@ components:
3092
3100
  - mcp:read
3093
3101
  - mcp:write
3094
3102
  x-enumDescriptions:
3095
- mcp:read: Grants read-only access to MCP server resources.
3096
- mcp:write: Grants write access to MCP server resources.
3103
+ mcp:read: Lists tools, prompts and resources and reads prompts and resources; can't call a tool.
3104
+ mcp:write: Calls tools (`tools/call`); also lists and reads.
3097
3105
  examples:
3098
3106
  - - mcp:read
3099
3107
  - mcp:write
@@ -4190,11 +4198,13 @@ components:
4190
4198
  after which the flag switches itself off), and concurrency climbs back toward
4191
4199
  `targetConcurrencyLevel`. While true, `targetConcurrencyLevel` is the throughput lever: a
4192
4200
  `concurrencyLevel` sent in a PUT is ignored, and one sent in a PATCH is stored but the
4193
- recovery machinery moves it back toward the target.
4201
+ recovery machinery moves it back toward the target. Recovery never runs on `ftp`
4202
+ connections: FTP errors aren't treated as rate limits.
4194
4203
  x-celigo-ai-guidance:
4195
4204
  - To change throughput while this is true, write `targetConcurrencyLevel`; a `concurrencyLevel` sent in a PUT returns 200 and changes nothing.
4196
4205
  - Turning it on copies `concurrencyLevel` into `targetConcurrencyLevel`; turning it off unsets the target and leaves `concurrencyLevel` at its current value, which may be below the old target if a recovery was in progress. A `targetConcurrencyLevel` written while this is false is unset by the save.
4197
4206
  - These four settings (`concurrencyLevel`, `targetConcurrencyLevel`, `_borrowConcurrencyFromConnectionId`, this flag) accept a credential-free `PATCH /v1/connections/{_id}`. A PUT replaces the whole document, so send each secret back as its masked `******` value (that keeps it) or as a new value, and never drop one to keep it — an omitted password or `http.encrypted` is cleared, and a static token left out (with no `refreshMethod`) fails the PUT with 422.
4207
+ - On an `ftp` connection recovery never runs, and transfer threads are `ftp.multiThreadCount`; while this is true a create sets `ftp.concurrencyLevel` to `ftp.targetConcurrencyLevel`, or to 1 without one.
4198
4208
  enableMicroBatchForOneToMany:
4199
4209
  type: boolean
4200
4210
  default: true
@@ -4812,6 +4822,10 @@ components:
4812
4822
  FTP servers often have low connection limits — keep this value conservative.
4813
4823
  Send no more than the account's licensed maximum, the license's `concurrency` (25 standard,
4814
4824
  50 with an Environments license).
4825
+ While `autoRecoverRateLimitErrors` is true, which a create gets unless it sends `false`, a create
4826
+ ignores the value sent here and sets this field to `targetConcurrencyLevel`, or to 1 when no
4827
+ target is sent. To start higher, send `targetConcurrencyLevel` too, or create with
4828
+ `autoRecoverRateLimitErrors: false`.
4815
4829
  Unlike the rest of the `ftp` object, a `PUT` that omits this field keeps the stored value instead of clearing it.
4816
4830
  minimum: 1
4817
4831
  maximum: 50
@@ -4821,8 +4835,9 @@ components:
4821
4835
  targetConcurrencyLevel:
4822
4836
  type: integer
4823
4837
  description: |
4824
- Target concurrency level for auto-scaling. The system adjusts concurrency
4825
- between 1 and this value based on server response feedback.
4838
+ While `autoRecoverRateLimitErrors` is true, a create sets `concurrencyLevel` to this value, and a
4839
+ create that omits it gets 1 for both. Auto-recovery never runs on FTP connections (FTP errors
4840
+ aren't treated as rate limits), so nothing climbs back to it.
4826
4841
  Kept on a `PUT` that omits it, like `concurrencyLevel`; unset by the save while
4827
4842
  `autoRecoverRateLimitErrors` is false.
4828
4843
  minimum: 1
@@ -4853,9 +4868,9 @@ components:
4853
4868
  type: integer
4854
4869
  readOnly: true
4855
4870
  description: |-
4856
- Server-maintained mirror of `multiThreadCount` used by concurrency
4857
- auto-scaling. Present only when rate-limit auto-recovery applies;
4858
- recomputed on save.
4871
+ Server-maintained mirror of `multiThreadCount`, present while
4872
+ `autoRecoverRateLimitErrors` is true and `targetConcurrencyLevel` is
4873
+ set; recomputed on save.
4859
4874
  if:
4860
4875
  properties:
4861
4876
  type:
package/dist/stack.yml CHANGED
@@ -106,7 +106,7 @@ paths:
106
106
  after creation via `GET /v1/stacks/{_id}/systemToken`.
107
107
  x-celigo-ai-guidance:
108
108
  - |-
109
- - For `type=server`, provide `server.hostURI` (and optional `server.ipRanges`).
109
+ - For `type=server`, provide `server.hostURI`. Don't send `server.ipRanges`: it's deprecated and nothing enforces it.
110
110
  - For `type=lambda`, provide AWS credentials and function details under `lambda`.
111
111
  operationId: createStack
112
112
  tags:
package/dist/template.yml CHANGED
@@ -22,8 +22,13 @@ tags:
22
22
 
23
23
  The template lifecycle is: create → upload zip (via `GET /v1/s3SignedURL`) → publish.
24
24
 
25
- All endpoints require a **Partner account** — non-partner callers
26
- receive 403 `access_restricted`.
25
+ Creating, updating, uploading and publishing templates requires a
26
+ **Partner account** — non-partner callers receive 403
27
+ `access_restricted`. Installing a template (`/v1/integrations/template`
28
+ routes) needs install permission instead: the account owner,
29
+ administrators and manage users have it, and monitor or
30
+ integration-level users only when their access allows creating
31
+ integrations.
27
32
 
28
33
  ## Template schema
29
34
 
@@ -377,6 +382,18 @@ paths:
377
382
  example:
378
383
  61f92026dd053843b5d72350: 64a1234567890abcdef12345
379
384
  61f92026dd053843b5d72351: 64a1234567890abcdef12346
385
+ _stackId:
386
+ type: string
387
+ format: objectId
388
+ x-celigo-refModel: stacks
389
+ description: |-
390
+ Stack for the template's hooks and wrapper connections that run on a stack.
391
+ Required when the template preview reports `stackRequired: true`: without
392
+ it the install fails with 400 `stack_not_found`. The stack must belong to
393
+ the environment or be shared with it (404 `stack_not_found` for an unknown
394
+ id, 400 `invalid_stack` otherwise).
395
+ examples:
396
+ - 5f8d43a1b9e5a80011a35f2c
380
397
  required:
381
398
  - connectionMap
382
399
  examples:
@@ -419,9 +436,12 @@ paths:
419
436
  _id: 6405b9d83496e05ff253d594
420
437
  '400':
421
438
  description: |-
422
- Missing or empty `connectionMap`, or the template is an MCP server
439
+ Missing or empty `connectionMap`; the template is an MCP server
423
440
  template that must be installed through
424
- `POST /v1/mcpservers/template/{_templateId}`.
441
+ `POST /v1/mcpservers/template/{_templateId}`; the template needs a
442
+ stack and the body has no `_stackId` (`stack_not_found`); or the
443
+ `_stackId` names a stack that neither belongs to this environment nor
444
+ is shared with it (`invalid_stack`).
425
445
  content:
426
446
  application/json:
427
447
  schema:
@@ -438,12 +458,18 @@ paths:
438
458
  errors:
439
459
  - code: invalid_template
440
460
  message: MCP server templates cannot be installed through the Integration template path.
461
+ missingStack:
462
+ summary: The preview reported stackRequired and no _stackId was sent
463
+ value:
464
+ errors:
465
+ - code: stack_not_found
466
+ message: The integration template has stack reference but _stackId not found in the request body.
441
467
  '401':
442
468
  $ref: '#/components/responses/401-unauthorized'
443
469
  '403':
444
- $ref: '#/components/responses/403-forbidden'
470
+ $ref: '#/components/responses/403-cannot-install'
445
471
  '404':
446
- description: Template not found.
472
+ description: Template not found, or no stack has the `_stackId` sent (`stack_not_found`).
447
473
  content:
448
474
  application/json:
449
475
  schema:
@@ -539,7 +565,7 @@ paths:
539
565
  '401':
540
566
  $ref: '#/components/responses/401-unauthorized'
541
567
  '403':
542
- $ref: '#/components/responses/403-forbidden'
568
+ $ref: '#/components/responses/403-cannot-install'
543
569
  '404':
544
570
  description: The `runKey` does not match any uploaded zip.
545
571
  content:
@@ -583,6 +609,16 @@ paths:
583
609
  the template zip file.
584
610
  examples:
585
611
  - abc123def456
612
+ _stackId:
613
+ type: string
614
+ format: objectId
615
+ x-celigo-refModel: stacks
616
+ description: |-
617
+ Stack for the template's hooks and wrapper connections that run on a stack.
618
+ Required when the preview reports `stackRequired: true` (400
619
+ `stack_not_found` without it).
620
+ examples:
621
+ - 5f8d43a1b9e5a80011a35f2c
586
622
  required:
587
623
  - runKey
588
624
  examples:
@@ -618,7 +654,7 @@ paths:
618
654
  '401':
619
655
  $ref: '#/components/responses/401-unauthorized'
620
656
  '403':
621
- $ref: '#/components/responses/403-forbidden'
657
+ $ref: '#/components/responses/403-cannot-install'
622
658
  '404':
623
659
  description: The `runKey` does not match any uploaded zip.
624
660
  content:
@@ -978,5 +1014,27 @@ components:
978
1014
  errors:
979
1015
  - code: invalid_request
980
1016
  message: The request body failed validation.
1017
+ 403-cannot-install:
1018
+ description: |-
1019
+ The caller may not install templates. The account owner, administrators and manage users
1020
+ can; a monitor user or a user with access to specific integrations only can install a
1021
+ template only when their access allows creating integrations
1022
+ (`allowIntegrationWorkspaceCreation`).
1023
+ content:
1024
+ application/json:
1025
+ schema:
1026
+ $ref: '#/components/schemas/Error'
1027
+ examples:
1028
+ cannotInstall:
1029
+ value:
1030
+ errors:
1031
+ - code: access_restricted
1032
+ message: Users with monitor or tile level manage permissions cannot install templates. Ask an account owner or administrator to increase your permissions, or contact another user with at least account level manage permissions to install the template.
1033
+ otherRole:
1034
+ summary: Any other role without install permission
1035
+ value:
1036
+ errors:
1037
+ - code: access_restricted
1038
+ message: The role which you are associated with doesn't have the required permissions to perform the action.
981
1039
  x-enable-proxy: true
982
1040
  x-internal: false