@celigo/api-specs 0.2.58 → 0.2.59

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.
@@ -0,0 +1,1316 @@
1
+ openapi: 3.2.0
2
+ info:
3
+ version: 1.0.0
4
+ title: File Server
5
+ description: Run a Celigo-hosted SFTP server whose partner accounts land files in Celigo Storage.
6
+ x-celigo-ai-guidance:
7
+ - |-
8
+ API for the account's Celigo-hosted SFTP file server: one server per environment
9
+ (`GET`/`PUT /v1/mft/fileserver`) and the partner accounts that log in to it
10
+ (`/v1/mft/fileserver/accounts`), each chrooted to a Celigo Storage folder. Requires a
11
+ full-access API token — folder-path-scoped and other restricted tokens answer 403
12
+ FILESERVER_FULL_ACCESS_TOKEN_REQUIRED on every route.
13
+ servers:
14
+ - url: https://api.integrator.io
15
+ description: Production (US / default region)
16
+ - url: https://api.eu.integrator.io
17
+ description: Production (EU region)
18
+ - url: https://api.au.integrator.io
19
+ description: Production (AU region)
20
+ - url: https://api.ca.integrator.io
21
+ description: Production (CA region)
22
+ security:
23
+ - bearerAuth: []
24
+ tags:
25
+ - name: File Server
26
+ description: |-
27
+ Each environment can run a Celigo-hosted SFTP file server. Enabling it claims a permanent `identifier` that becomes part of every partner login (`<username>@<identifier>`) and exposes the shared endpoint and host-key fingerprints partners need to connect. Partner accounts are created under the server, each with its own password and a Celigo Storage folder that becomes the account's root, so files a partner uploads appear in that folder and files placed there are what the partner can download. The account's license must include the file server add-on (`fileserver.enabled`), and every call needs a full-access API token.
28
+
29
+ ## File server and account schemas
30
+
31
+ {% openapi-schemas spec="fileserver" schemas="FileServer,FileServerAccount" grouped="true" %}
32
+ paths:
33
+ /v1/mft/fileserver:
34
+ get:
35
+ x-internal: false
36
+ operationId: getFileServer
37
+ tags:
38
+ - File Server
39
+ summary: Get the environment's file server
40
+ description: |-
41
+ Returns the environment's SFTP file server: whether it is enabled, its permanent
42
+ `identifier`, the shared `endpoint` and host-key fingerprints partners connect
43
+ with, the `loginFormat`, and the effective `limits`. The server is a singleton
44
+ resolved from the caller's token — there is no id in the URL. An entitled
45
+ environment whose server was never enabled answers 404; an environment without
46
+ the file server add-on gets the reduced object (`entitled: false`, `endpoint`,
47
+ `limits`) with 200. Requires a full-access API token.
48
+ responses:
49
+ '200':
50
+ description: The file server, or the reduced object when the add-on is not licensed.
51
+ content:
52
+ application/json:
53
+ schema:
54
+ $ref: '#/components/schemas/FileServer'
55
+ examples:
56
+ enabled:
57
+ summary: Enabled server
58
+ value:
59
+ _id: 6ab1ef197cf630a06d774cf1
60
+ enabled: true
61
+ identifier: acme-logistics
62
+ endpoint:
63
+ hostname: sftp.integrator.io
64
+ port: 22
65
+ hostKeyFingerprints:
66
+ - algorithm: ssh-ed25519
67
+ fingerprint: SHA256:iYC+28MNea2ebwWmUMdnJRx0StabV53gZBmr6pto9fs
68
+ - algorithm: rsa-sha2-512
69
+ fingerprint: SHA256:0Qy3l7fJ2Zb1n8VtY4cH6uWkPq9rS2dE5gL7mN1oT3A
70
+ loginFormat: <username>@acme-logistics
71
+ limits:
72
+ maxAccounts: 1000
73
+ maxConcurrentSessionsPerAccount: 20
74
+ maxFileSizeBytes: 10737418240
75
+ entitled: true
76
+ notEntitled:
77
+ summary: Environment without the add-on
78
+ value:
79
+ entitled: false
80
+ endpoint:
81
+ hostname: sftp.integrator.io
82
+ port: 22
83
+ limits:
84
+ maxAccounts: 500
85
+ maxConcurrentSessionsPerAccount: 10
86
+ maxFileSizeBytes: 10737418240
87
+ '401':
88
+ $ref: '#/components/responses/401-unauthorized'
89
+ '403':
90
+ description: The token is not a full-access API token (`FILESERVER_FULL_ACCESS_TOKEN_REQUIRED`).
91
+ content:
92
+ application/json:
93
+ schema:
94
+ $ref: '#/components/schemas/Error'
95
+ examples:
96
+ scopedToken:
97
+ value:
98
+ errors:
99
+ - code: FILESERVER_FULL_ACCESS_TOKEN_REQUIRED
100
+ message: The file server management APIs require an API token with full access
101
+ '404':
102
+ description: The environment is entitled but its server has never been enabled (`FILESERVER_NOT_FOUND`).
103
+ content:
104
+ application/json:
105
+ schema:
106
+ $ref: '#/components/schemas/Error'
107
+ examples:
108
+ neverEnabled:
109
+ value:
110
+ errors:
111
+ - code: FILESERVER_NOT_FOUND
112
+ message: The file server has not been enabled for this environment
113
+ put:
114
+ x-internal: false
115
+ operationId: updateFileServer
116
+ tags:
117
+ - File Server
118
+ summary: Enable or disable the file server
119
+ description: |-
120
+ Enables the environment's file server — creating it, and claiming the permanent
121
+ `identifier`, on the first call — or disables it. The body must carry `enabled`
122
+ as a JSON boolean; anything else is refused rather than interpreted, because a
123
+ disable ends every open partner session. Enabling also checks the environment's
124
+ Celigo Storage entitlement (partner uploads land there) and returns the current
125
+ `storageUsage` alongside the server. Disabling keeps the identifier and every
126
+ account, refuses new logins, and ends open sessions; repeating a disable is a
127
+ no-op. Sandbox environments cannot enable a server (403
128
+ `FILESERVER_NOT_ENTITLED`). Requires a full-access API token.
129
+ requestBody:
130
+ required: true
131
+ content:
132
+ application/json:
133
+ schema:
134
+ $ref: '#/components/schemas/FileServerRequest'
135
+ examples:
136
+ enableFirstTime:
137
+ summary: First enable — claims the identifier
138
+ value:
139
+ enabled: true
140
+ identifier: acme-logistics
141
+ disable:
142
+ summary: Disable (identifier may be echoed, never changed)
143
+ value:
144
+ enabled: false
145
+ responses:
146
+ '200':
147
+ description: The server after the change. Includes `storageUsage` when the call enabled it.
148
+ content:
149
+ application/json:
150
+ schema:
151
+ $ref: '#/components/schemas/FileServer'
152
+ examples:
153
+ disabled:
154
+ summary: Disabled server
155
+ value:
156
+ _id: 6ab1ef197cf630a06d774cf1
157
+ enabled: false
158
+ identifier: acme-logistics
159
+ endpoint:
160
+ hostname: sftp.integrator.io
161
+ port: 22
162
+ hostKeyFingerprints:
163
+ - algorithm: ssh-ed25519
164
+ fingerprint: SHA256:iYC+28MNea2ebwWmUMdnJRx0StabV53gZBmr6pto9fs
165
+ loginFormat: <username>@acme-logistics
166
+ limits:
167
+ maxAccounts: 1000
168
+ maxConcurrentSessionsPerAccount: 20
169
+ maxFileSizeBytes: 10737418240
170
+ entitled: true
171
+ '400':
172
+ description: The body is not a JSON object sent as `application/json` (`FILESERVER_JSON_BODY_REQUIRED`).
173
+ content:
174
+ application/json:
175
+ schema:
176
+ $ref: '#/components/schemas/Error'
177
+ examples:
178
+ notJson:
179
+ value:
180
+ errors:
181
+ - code: FILESERVER_JSON_BODY_REQUIRED
182
+ message: 'Request body must be a JSON object sent with Content-Type: application/json'
183
+ '401':
184
+ $ref: '#/components/responses/401-unauthorized'
185
+ '403':
186
+ description: |-
187
+ The token is not a full-access API token (`FILESERVER_FULL_ACCESS_TOKEN_REQUIRED`),
188
+ the account's license lacks the file server add-on or the environment is a
189
+ sandbox (`FILESERVER_NOT_ENTITLED`).
190
+ content:
191
+ application/json:
192
+ schema:
193
+ $ref: '#/components/schemas/Error'
194
+ examples:
195
+ notEntitled:
196
+ value:
197
+ errors:
198
+ - code: FILESERVER_NOT_ENTITLED
199
+ message: The file server add-on is not enabled for this account
200
+ '404':
201
+ description: A disable was sent for an environment whose server was never enabled (`FILESERVER_NOT_FOUND`).
202
+ content:
203
+ application/json:
204
+ schema:
205
+ $ref: '#/components/schemas/Error'
206
+ examples:
207
+ neverEnabled:
208
+ value:
209
+ errors:
210
+ - code: FILESERVER_NOT_FOUND
211
+ message: The file server has not been enabled for this environment
212
+ '409':
213
+ description: The identifier is already held by another environment in the region (`FILESERVER_IDENTIFIER_TAKEN`).
214
+ content:
215
+ application/json:
216
+ schema:
217
+ $ref: '#/components/schemas/Error'
218
+ examples:
219
+ taken:
220
+ value:
221
+ errors:
222
+ - code: FILESERVER_IDENTIFIER_TAKEN
223
+ message: This identifier is already in use
224
+ '422':
225
+ description: |-
226
+ `enabled` is missing or not a boolean (`FILESERVER_ENABLED_REQUIRED`), the
227
+ first-enable `identifier` is missing or malformed (`FILESERVER_IDENTIFIER_INVALID`),
228
+ or the body names an identifier different from the server's permanent one
229
+ (`FILESERVER_IDENTIFIER_IMMUTABLE`).
230
+ content:
231
+ application/json:
232
+ schema:
233
+ $ref: '#/components/schemas/Error'
234
+ examples:
235
+ enabledRequired:
236
+ value:
237
+ errors:
238
+ - code: FILESERVER_ENABLED_REQUIRED
239
+ message: '"enabled" is required and must be a boolean'
240
+ identifierImmutable:
241
+ value:
242
+ errors:
243
+ - code: FILESERVER_IDENTIFIER_IMMUTABLE
244
+ message: The file server identifier cannot be changed
245
+ identifierInvalid:
246
+ value:
247
+ errors:
248
+ - code: FILESERVER_IDENTIFIER_INVALID
249
+ message: Identifier must be 3-30 lowercase letters, digits or hyphens, with no leading or trailing hyphen
250
+ '503':
251
+ description: |-
252
+ Enabling requires a live check of the environment's Celigo Storage entitlement;
253
+ when that check cannot complete the enable is refused with
254
+ `FILESERVER_STORAGE_UNAVAILABLE` and nothing changes. Retry later.
255
+ content:
256
+ application/json:
257
+ schema:
258
+ $ref: '#/components/schemas/Error'
259
+ examples:
260
+ storageUnavailable:
261
+ value:
262
+ errors:
263
+ - code: FILESERVER_STORAGE_UNAVAILABLE
264
+ message: 'File storage is temporarily unavailable: storage entitlement could not be verified'
265
+ /v1/mft/fileserver/accounts:
266
+ get:
267
+ x-internal: false
268
+ operationId: listFileServerAccounts
269
+ tags:
270
+ - File Server
271
+ summary: List file server accounts
272
+ description: |-
273
+ Returns the environment's partner accounts oldest first, wrapped in an
274
+ `accounts` array, with `overCap` computed for each against the current
275
+ `limits.maxAccounts`. Paging is cursor-based: when more accounts follow, the
276
+ `Link` header carries a `rel="next"` URL whose `after` cursor (and `pageSize`)
277
+ fetch the next page, and a page reached through `after` also offers
278
+ `rel="prev"`. Cursors are opaque — pass them back exactly as received; anything
279
+ else answers 400 `FILESERVER_INVALID_CURSOR`. Accounts stay listable after the
280
+ add-on is removed from the license; only writes are blocked then. Requires a
281
+ full-access API token and a server that has been enabled at least once.
282
+ parameters:
283
+ - name: pageSize
284
+ in: query
285
+ required: false
286
+ description: Accounts per page. Values outside the range are clamped rather than rejected.
287
+ schema:
288
+ type: integer
289
+ minimum: 1
290
+ maximum: 1000
291
+ default: 100
292
+ examples:
293
+ - 100
294
+ - name: after
295
+ in: query
296
+ required: false
297
+ description: Opaque cursor from the previous page's `rel="next"` link. Returns the accounts created after it.
298
+ schema:
299
+ type: string
300
+ - name: before
301
+ in: query
302
+ required: false
303
+ description: Opaque cursor from a page's `rel="prev"` link. Returns the accounts created before it. Ignored when `after` is also sent.
304
+ schema:
305
+ type: string
306
+ responses:
307
+ '200':
308
+ description: One page of accounts.
309
+ headers:
310
+ Link:
311
+ description: |-
312
+ RFC 8288 pagination links: `<…?after=…&pageSize=…>; rel="next"` when more
313
+ accounts follow, `<…?before=…&pageSize=…>; rel="prev"` when the page was
314
+ reached through a cursor. Absent when the whole list fits in one page.
315
+ schema:
316
+ type: string
317
+ content:
318
+ application/json:
319
+ schema:
320
+ type: object
321
+ required:
322
+ - accounts
323
+ properties:
324
+ accounts:
325
+ type: array
326
+ items:
327
+ $ref: '#/components/schemas/FileServerAccount'
328
+ examples:
329
+ default:
330
+ value:
331
+ accounts:
332
+ - _id: 6ab1f2737cf630a06d774d09
333
+ username: northwind-edi
334
+ login: northwind-edi@acme-logistics
335
+ _homeFolderId: 6ab1f25daa3e7ed226ea3f25
336
+ homeFolderPath: Partners/Northwind/Inbound
337
+ enabled: true
338
+ passwordSet: true
339
+ overCap: false
340
+ lastConnectedAt: '2026-09-22T14:35:31.646Z'
341
+ createdAt: '2026-09-22T03:13:56.060Z'
342
+ lastModified: '2026-09-22T14:35:31.648Z'
343
+ '400':
344
+ description: The `after` or `before` cursor is not one this list issued (`FILESERVER_INVALID_CURSOR`).
345
+ content:
346
+ application/json:
347
+ schema:
348
+ $ref: '#/components/schemas/Error'
349
+ examples:
350
+ invalidCursor:
351
+ value:
352
+ errors:
353
+ - code: FILESERVER_INVALID_CURSOR
354
+ message: Invalid pagination cursor
355
+ '401':
356
+ $ref: '#/components/responses/401-unauthorized'
357
+ '403':
358
+ description: The token is not a full-access API token (`FILESERVER_FULL_ACCESS_TOKEN_REQUIRED`), or the environment is a sandbox (`FILESERVER_NOT_ENTITLED`).
359
+ content:
360
+ application/json:
361
+ schema:
362
+ $ref: '#/components/schemas/Error'
363
+ examples:
364
+ scopedToken:
365
+ value:
366
+ errors:
367
+ - code: FILESERVER_FULL_ACCESS_TOKEN_REQUIRED
368
+ message: The file server management APIs require an API token with full access
369
+ '422':
370
+ description: The environment's server has never been enabled (`FILESERVER_NOT_ENABLED`); a disabled server is still manageable.
371
+ content:
372
+ application/json:
373
+ schema:
374
+ $ref: '#/components/schemas/Error'
375
+ examples:
376
+ notEnabled:
377
+ value:
378
+ errors:
379
+ - code: FILESERVER_NOT_ENABLED
380
+ message: Enable the file server before managing accounts
381
+ post:
382
+ x-internal: false
383
+ operationId: createFileServerAccount
384
+ tags:
385
+ - File Server
386
+ summary: Create a file server account
387
+ description: |-
388
+ Creates an enabled partner account with the given `username`, `password`, and
389
+ Celigo Storage home folder, and returns it (the password is never returned).
390
+ Checks run in order and the first failure is answered: username shape, password
391
+ presence, home-folder presence, the enabled-account cap, then the folder is
392
+ verified to be an active folder in this environment. Requires a full-access API
393
+ token, the file server add-on on the license, and a server that has been enabled
394
+ at least once.
395
+ requestBody:
396
+ required: true
397
+ content:
398
+ application/json:
399
+ schema:
400
+ $ref: '#/components/schemas/FileServerAccountCreateRequest'
401
+ examples:
402
+ default:
403
+ value:
404
+ username: northwind-edi
405
+ password: Nw-Inbound-2026!x
406
+ _homeFolderId: 6ab1f25daa3e7ed226ea3f25
407
+ responses:
408
+ '201':
409
+ description: The new account.
410
+ content:
411
+ application/json:
412
+ schema:
413
+ $ref: '#/components/schemas/FileServerAccount'
414
+ examples:
415
+ default:
416
+ value:
417
+ _id: 6ab1f2737cf630a06d774d09
418
+ username: northwind-edi
419
+ login: northwind-edi@acme-logistics
420
+ _homeFolderId: 6ab1f25daa3e7ed226ea3f25
421
+ homeFolderPath: Partners/Northwind/Inbound
422
+ enabled: true
423
+ passwordSet: true
424
+ overCap: false
425
+ lastConnectedAt: null
426
+ createdAt: '2026-09-22T03:13:56.060Z'
427
+ lastModified: '2026-09-22T03:13:56.060Z'
428
+ '400':
429
+ description: The body is not a JSON object sent as `application/json` (`FILESERVER_JSON_BODY_REQUIRED`).
430
+ content:
431
+ application/json:
432
+ schema:
433
+ $ref: '#/components/schemas/Error'
434
+ examples:
435
+ notJson:
436
+ value:
437
+ errors:
438
+ - code: FILESERVER_JSON_BODY_REQUIRED
439
+ message: 'Request body must be a JSON object sent with Content-Type: application/json'
440
+ '401':
441
+ $ref: '#/components/responses/401-unauthorized'
442
+ '403':
443
+ description: |-
444
+ The token is not a full-access API token (`FILESERVER_FULL_ACCESS_TOKEN_REQUIRED`);
445
+ the license lacks the add-on or the environment is a sandbox
446
+ (`FILESERVER_NOT_ENTITLED`); or the environment already holds
447
+ `limits.maxAccounts` enabled accounts (`FILESERVER_MAX_ACCOUNTS_EXCEEDED`).
448
+ content:
449
+ application/json:
450
+ schema:
451
+ $ref: '#/components/schemas/Error'
452
+ examples:
453
+ capReached:
454
+ value:
455
+ errors:
456
+ - code: FILESERVER_MAX_ACCOUNTS_EXCEEDED
457
+ message: The maximum number of enabled accounts for this environment has been reached
458
+ '409':
459
+ description: Another account in this environment already has that username, enabled or not (`FILESERVER_USERNAME_TAKEN`).
460
+ content:
461
+ application/json:
462
+ schema:
463
+ $ref: '#/components/schemas/Error'
464
+ examples:
465
+ usernameTaken:
466
+ value:
467
+ errors:
468
+ - code: FILESERVER_USERNAME_TAKEN
469
+ message: This username is already in use on this file server
470
+ '422':
471
+ description: |-
472
+ The server has never been enabled (`FILESERVER_NOT_ENABLED`); `username` is
473
+ missing or malformed (`FILESERVER_USERNAME_INVALID`); `password` is missing
474
+ (`FILESERVER_LAST_CREDENTIAL`) or too weak (`FILESERVER_WEAK_PASSWORD`);
475
+ `_homeFolderId` is missing or does not exist in this environment
476
+ (`FILESERVER_HOME_FOLDER_NOT_FOUND`) or is a file rather than an active folder
477
+ (`FILESERVER_HOME_FOLDER_NOT_FOLDER`).
478
+ content:
479
+ application/json:
480
+ schema:
481
+ $ref: '#/components/schemas/Error'
482
+ examples:
483
+ usernameInvalid:
484
+ value:
485
+ errors:
486
+ - code: FILESERVER_USERNAME_INVALID
487
+ message: Username must be 3-32 lowercase letters, digits or hyphens, with no leading or trailing hyphen
488
+ passwordMissing:
489
+ value:
490
+ errors:
491
+ - code: FILESERVER_LAST_CREDENTIAL
492
+ message: An enabled account must have a password
493
+ homeFolderMissing:
494
+ value:
495
+ errors:
496
+ - code: FILESERVER_HOME_FOLDER_NOT_FOUND
497
+ message: The home folder does not exist in this environment
498
+ '503':
499
+ description: |-
500
+ The home folder is verified against Celigo Storage at create time; when that
501
+ check cannot complete the create is refused with `FILESERVER_STORAGE_UNAVAILABLE`
502
+ and no account is made. Retry later.
503
+ content:
504
+ application/json:
505
+ schema:
506
+ $ref: '#/components/schemas/Error'
507
+ examples:
508
+ storageUnavailable:
509
+ value:
510
+ errors:
511
+ - code: FILESERVER_STORAGE_UNAVAILABLE
512
+ message: 'File storage is temporarily unavailable: home-folder validation failed'
513
+ /v1/mft/fileserver/accounts/{_id}:
514
+ get:
515
+ x-internal: false
516
+ operationId: getFileServerAccount
517
+ tags:
518
+ - File Server
519
+ summary: Get a file server account
520
+ description: |-
521
+ Returns one partner account with `overCap` computed against the current cap.
522
+ An id that is unknown, belongs to another environment, or is not a valid
523
+ identifier all answer the same 404. Requires a full-access API token and a
524
+ server that has been enabled at least once.
525
+ parameters:
526
+ - $ref: '#/components/parameters/AccountId'
527
+ responses:
528
+ '200':
529
+ description: The account.
530
+ content:
531
+ application/json:
532
+ schema:
533
+ $ref: '#/components/schemas/FileServerAccount'
534
+ examples:
535
+ default:
536
+ value:
537
+ _id: 6ab1f2737cf630a06d774d09
538
+ username: northwind-edi
539
+ login: northwind-edi@acme-logistics
540
+ _homeFolderId: 6ab1f25daa3e7ed226ea3f25
541
+ homeFolderPath: Partners/Northwind/Inbound
542
+ enabled: true
543
+ passwordSet: true
544
+ overCap: false
545
+ lastConnectedAt: '2026-09-22T14:35:31.646Z'
546
+ createdAt: '2026-09-22T03:13:56.060Z'
547
+ lastModified: '2026-09-22T14:35:31.648Z'
548
+ '401':
549
+ $ref: '#/components/responses/401-unauthorized'
550
+ '403':
551
+ $ref: '#/components/responses/403-full-access-required'
552
+ '404':
553
+ $ref: '#/components/responses/404-account-not-found'
554
+ '422':
555
+ $ref: '#/components/responses/422-server-not-enabled'
556
+ put:
557
+ x-internal: false
558
+ operationId: updateFileServerAccount
559
+ tags:
560
+ - File Server
561
+ summary: Update a file server account
562
+ description: |-
563
+ Changes the fields sent and returns the account; fields left out keep their
564
+ values, and `{}` returns the account unchanged. Renaming keeps `_id` and
565
+ updates `login`. Moving the home folder is verified against Celigo Storage and
566
+ ends the account's open sessions, as does disabling it. Re-enabling counts
567
+ against `limits.maxAccounts` and requires a password to be set. The password
568
+ cannot be changed here — use `POST /v1/mft/fileserver/accounts/{_id}/password`.
569
+ Requires a full-access API token, the file server add-on on the license, and a
570
+ server that has been enabled at least once.
571
+ parameters:
572
+ - $ref: '#/components/parameters/AccountId'
573
+ requestBody:
574
+ required: true
575
+ content:
576
+ application/json:
577
+ schema:
578
+ $ref: '#/components/schemas/FileServerAccountUpdateRequest'
579
+ examples:
580
+ disable:
581
+ summary: Disable the account
582
+ value:
583
+ enabled: false
584
+ rename:
585
+ summary: Rename
586
+ value:
587
+ username: northwind-edi-2
588
+ responses:
589
+ '200':
590
+ description: The account after the change.
591
+ content:
592
+ application/json:
593
+ schema:
594
+ $ref: '#/components/schemas/FileServerAccount'
595
+ examples:
596
+ disabled:
597
+ value:
598
+ _id: 6ab1f2737cf630a06d774d09
599
+ username: northwind-edi
600
+ login: northwind-edi@acme-logistics
601
+ _homeFolderId: 6ab1f25daa3e7ed226ea3f25
602
+ homeFolderPath: Partners/Northwind/Inbound
603
+ enabled: false
604
+ passwordSet: true
605
+ overCap: false
606
+ lastConnectedAt: '2026-09-22T14:35:31.646Z'
607
+ createdAt: '2026-09-22T03:13:56.060Z'
608
+ lastModified: '2026-09-25T01:40:12.004Z'
609
+ '400':
610
+ description: The body is not a JSON object sent as `application/json` (`FILESERVER_JSON_BODY_REQUIRED`).
611
+ content:
612
+ application/json:
613
+ schema:
614
+ $ref: '#/components/schemas/Error'
615
+ examples:
616
+ notJson:
617
+ value:
618
+ errors:
619
+ - code: FILESERVER_JSON_BODY_REQUIRED
620
+ message: 'Request body must be a JSON object sent with Content-Type: application/json'
621
+ '401':
622
+ $ref: '#/components/responses/401-unauthorized'
623
+ '403':
624
+ description: |-
625
+ The token is not a full-access API token (`FILESERVER_FULL_ACCESS_TOKEN_REQUIRED`);
626
+ the license lacks the add-on or the environment is a sandbox
627
+ (`FILESERVER_NOT_ENTITLED`); or re-enabling would exceed `limits.maxAccounts`
628
+ (`FILESERVER_MAX_ACCOUNTS_EXCEEDED`).
629
+ content:
630
+ application/json:
631
+ schema:
632
+ $ref: '#/components/schemas/Error'
633
+ examples:
634
+ capReached:
635
+ value:
636
+ errors:
637
+ - code: FILESERVER_MAX_ACCOUNTS_EXCEEDED
638
+ message: The maximum number of enabled accounts for this environment has been reached
639
+ '404':
640
+ $ref: '#/components/responses/404-account-not-found'
641
+ '409':
642
+ description: The new username belongs to another account in this environment (`FILESERVER_USERNAME_TAKEN`).
643
+ content:
644
+ application/json:
645
+ schema:
646
+ $ref: '#/components/schemas/Error'
647
+ examples:
648
+ usernameTaken:
649
+ value:
650
+ errors:
651
+ - code: FILESERVER_USERNAME_TAKEN
652
+ message: This username is already in use on this file server
653
+ '422':
654
+ description: |-
655
+ The server has never been enabled (`FILESERVER_NOT_ENABLED`); `username` is
656
+ malformed (`FILESERVER_USERNAME_INVALID`); `enabled` is present but not a
657
+ boolean (`FILESERVER_ENABLED_REQUIRED`); re-enabling an account with no
658
+ password (`FILESERVER_LAST_CREDENTIAL`); or the new home folder does not exist
659
+ or is not an active folder (`FILESERVER_HOME_FOLDER_NOT_FOUND`,
660
+ `FILESERVER_HOME_FOLDER_NOT_FOLDER`).
661
+ content:
662
+ application/json:
663
+ schema:
664
+ $ref: '#/components/schemas/Error'
665
+ examples:
666
+ enabledRequired:
667
+ value:
668
+ errors:
669
+ - code: FILESERVER_ENABLED_REQUIRED
670
+ message: '"enabled" is required and must be a boolean'
671
+ noPassword:
672
+ value:
673
+ errors:
674
+ - code: FILESERVER_LAST_CREDENTIAL
675
+ message: An enabled account must have a password
676
+ '503':
677
+ description: The new home folder could not be verified against Celigo Storage (`FILESERVER_STORAGE_UNAVAILABLE`); nothing changed. Retry later.
678
+ content:
679
+ application/json:
680
+ schema:
681
+ $ref: '#/components/schemas/Error'
682
+ examples:
683
+ storageUnavailable:
684
+ value:
685
+ errors:
686
+ - code: FILESERVER_STORAGE_UNAVAILABLE
687
+ message: 'File storage is temporarily unavailable: home-folder validation failed'
688
+ delete:
689
+ x-internal: false
690
+ operationId: deleteFileServerAccount
691
+ tags:
692
+ - File Server
693
+ summary: Delete a file server account
694
+ description: |-
695
+ Permanently removes the account and ends any session it has open. The home
696
+ folder and its files are untouched. There is no recycle bin for accounts —
697
+ recreate one to restore access. Requires a full-access API token, the file
698
+ server add-on on the license, and a server that has been enabled at least once.
699
+ parameters:
700
+ - $ref: '#/components/parameters/AccountId'
701
+ responses:
702
+ '204':
703
+ description: Account deleted.
704
+ '401':
705
+ $ref: '#/components/responses/401-unauthorized'
706
+ '403':
707
+ $ref: '#/components/responses/403-full-access-required'
708
+ '404':
709
+ $ref: '#/components/responses/404-account-not-found'
710
+ '422':
711
+ $ref: '#/components/responses/422-server-not-enabled'
712
+ /v1/mft/fileserver/accounts/{_id}/password:
713
+ post:
714
+ x-internal: false
715
+ operationId: setFileServerAccountPassword
716
+ tags:
717
+ - File Server
718
+ summary: Set or clear an account's password
719
+ description: |-
720
+ Sets a new password for the partner account, or clears it when `password` is
721
+ `null`. Clearing is refused while the account is enabled, because an enabled
722
+ account must keep a credential — disable it first. Either change ends the
723
+ account's open sessions and stamps the change for session revalidation. The
724
+ route answers 204 and never echoes a credential; `passwordSet` on the account
725
+ reflects the result. Requires a full-access API token, the file server add-on on
726
+ the license, and a server that has been enabled at least once.
727
+ parameters:
728
+ - $ref: '#/components/parameters/AccountId'
729
+ requestBody:
730
+ required: true
731
+ content:
732
+ application/json:
733
+ schema:
734
+ $ref: '#/components/schemas/FileServerAccountPasswordRequest'
735
+ examples:
736
+ rotate:
737
+ summary: Set a new password
738
+ value:
739
+ password: Nw-Inbound-2026!y
740
+ clear:
741
+ summary: Clear the password of a disabled account
742
+ value:
743
+ password: null
744
+ responses:
745
+ '204':
746
+ description: Password set or cleared. No body.
747
+ '400':
748
+ description: The body is not a JSON object sent as `application/json` (`FILESERVER_JSON_BODY_REQUIRED`).
749
+ content:
750
+ application/json:
751
+ schema:
752
+ $ref: '#/components/schemas/Error'
753
+ examples:
754
+ notJson:
755
+ value:
756
+ errors:
757
+ - code: FILESERVER_JSON_BODY_REQUIRED
758
+ message: 'Request body must be a JSON object sent with Content-Type: application/json'
759
+ '401':
760
+ $ref: '#/components/responses/401-unauthorized'
761
+ '403':
762
+ $ref: '#/components/responses/403-full-access-required'
763
+ '404':
764
+ $ref: '#/components/responses/404-account-not-found'
765
+ '422':
766
+ description: |-
767
+ The server has never been enabled (`FILESERVER_NOT_ENABLED`); the new password
768
+ breaks the policy or `password` is neither a string nor `null`
769
+ (`FILESERVER_WEAK_PASSWORD` — the message names the rule); or `null` was sent
770
+ for an enabled account (`FILESERVER_LAST_CREDENTIAL`).
771
+ content:
772
+ application/json:
773
+ schema:
774
+ $ref: '#/components/schemas/Error'
775
+ examples:
776
+ weakPassword:
777
+ value:
778
+ errors:
779
+ - code: FILESERVER_WEAK_PASSWORD
780
+ message: Password must be a string (or null to clear).
781
+ lastCredential:
782
+ value:
783
+ errors:
784
+ - code: FILESERVER_LAST_CREDENTIAL
785
+ message: An enabled account must have a password
786
+ components:
787
+ securitySchemes:
788
+ bearerAuth:
789
+ type: http
790
+ scheme: bearer
791
+ schemas:
792
+ FileServer:
793
+ type: object
794
+ description: |-
795
+ The environment's SFTP file server — one per environment, resolved from the
796
+ caller's token (no id in the URL). Partners connect to `endpoint`, verify the
797
+ server against `hostKeyFingerprints`, and log in as `<username>@<identifier>`
798
+ with a partner account's password. On an entitled environment where the server
799
+ has never been enabled, reads answer 404 rather than returning this object; an
800
+ environment without the file server add-on gets a reduced object carrying only
801
+ `entitled: false`, `endpoint`, and `limits`.
802
+ required:
803
+ - endpoint
804
+ - limits
805
+ - entitled
806
+ properties:
807
+ _id:
808
+ type: string
809
+ format: objectId
810
+ readOnly: true
811
+ description: Identifier of the file server record. Absent on the reduced object returned to an environment without the add-on.
812
+ examples:
813
+ - 6ab1ef197cf630a06d774cf1
814
+ enabled:
815
+ type: boolean
816
+ description: |-
817
+ When true, partners can connect and every enabled account can log in. Setting
818
+ it to false on `PUT` keeps the identifier and all accounts, refuses new
819
+ logins, and ends any session currently open; the same body sent again is a
820
+ no-op. Absent on the reduced object returned to an environment without the
821
+ add-on.
822
+ examples:
823
+ - true
824
+ identifier:
825
+ type: string
826
+ minLength: 3
827
+ maxLength: 30
828
+ pattern: ^[a-z0-9](?:[a-z0-9-]{1,28}[a-z0-9])$
829
+ description: |-
830
+ The environment's name inside every partner login (`<username>@<identifier>`),
831
+ unique across the region. Chosen on the `PUT` that first enables the server,
832
+ lowercased on save, and permanent afterwards — a later `PUT` may echo it but a
833
+ different value is rejected with 422 `FILESERVER_IDENTIFIER_IMMUTABLE`.
834
+ Absent on the reduced object returned to an environment without the add-on.
835
+ examples:
836
+ - acme-logistics
837
+ endpoint:
838
+ type: object
839
+ readOnly: true
840
+ description: Where partners connect. Shared by every environment in the region; the `identifier` in the login routes the session.
841
+ required:
842
+ - hostname
843
+ - port
844
+ properties:
845
+ hostname:
846
+ type: string
847
+ description: SFTP host partners connect to.
848
+ examples:
849
+ - sftp.integrator.io
850
+ port:
851
+ type: integer
852
+ description: TCP port of the SFTP listener.
853
+ examples:
854
+ - 22
855
+ hostKeyFingerprints:
856
+ type: array
857
+ readOnly: true
858
+ description: |-
859
+ SHA-256 fingerprints of the server's SSH host keys, one per algorithm, for
860
+ partners to pin before their first connection. Absent on the reduced object
861
+ returned to an environment without the add-on.
862
+ items:
863
+ type: object
864
+ required:
865
+ - algorithm
866
+ - fingerprint
867
+ properties:
868
+ algorithm:
869
+ type: string
870
+ description: SSH host-key algorithm the fingerprint belongs to.
871
+ examples:
872
+ - ssh-ed25519
873
+ fingerprint:
874
+ type: string
875
+ description: Fingerprint in OpenSSH `SHA256:<base64>` form.
876
+ examples:
877
+ - SHA256:iYC+28MNea2ebwWmUMdnJRx0StabV53gZBmr6pto9fs
878
+ loginFormat:
879
+ type: string
880
+ readOnly: true
881
+ description: Template for partner usernames on this server — the account's `username`, `@`, then the server `identifier`. Absent on the reduced object returned to an environment without the add-on.
882
+ examples:
883
+ - <username>@acme-logistics
884
+ limits:
885
+ type: object
886
+ readOnly: true
887
+ description: Effective ceilings for this environment, from the license where it sets them and from platform defaults otherwise.
888
+ required:
889
+ - maxAccounts
890
+ - maxConcurrentSessionsPerAccount
891
+ - maxFileSizeBytes
892
+ properties:
893
+ maxAccounts:
894
+ type: integer
895
+ minimum: 0
896
+ description: Number of enabled accounts the environment may hold. Creating or re-enabling an account past it answers 403 `FILESERVER_MAX_ACCOUNTS_EXCEEDED`.
897
+ examples:
898
+ - 1000
899
+ maxConcurrentSessionsPerAccount:
900
+ type: integer
901
+ minimum: 0
902
+ description: Sessions one account may hold open at once; further logins are refused until one closes.
903
+ examples:
904
+ - 20
905
+ maxFileSizeBytes:
906
+ type: integer
907
+ minimum: 0
908
+ description: Largest single file a partner may upload, in bytes.
909
+ examples:
910
+ - 10737418240
911
+ entitled:
912
+ type: boolean
913
+ readOnly: true
914
+ description: |-
915
+ When true, the account's license includes the file server add-on
916
+ (`fileserver.enabled`) and the server can be enabled and managed. When false
917
+ the object is reduced to `endpoint` and `limits`, and every `PUT` and every
918
+ account write answers 403 `FILESERVER_NOT_ENTITLED`; existing accounts stay
919
+ readable.
920
+ examples:
921
+ - true
922
+ storageUsage:
923
+ type: object
924
+ readOnly: true
925
+ additionalProperties: true
926
+ description: |-
927
+ Only present on the `PUT` response that enables the server: the environment's
928
+ Celigo Storage usage as `GET /v1/storage/usage` reports it, checked at enable
929
+ time because partner uploads land in that storage.
930
+ Error:
931
+ type: object
932
+ description: Standard error response envelope returned by integrator.io APIs.
933
+ properties:
934
+ errors:
935
+ type: array
936
+ description: List of errors that occurred while processing the request.
937
+ items:
938
+ type: object
939
+ properties:
940
+ code:
941
+ oneOf:
942
+ - type: string
943
+ - type: integer
944
+ description: |-
945
+ Machine-readable error code. Usually a string like
946
+ `invalid_ref`, `missing_required_field`, or `unauthorized`;
947
+ may be an **integer** when the error mirrors an upstream HTTP
948
+ status (e.g. `500`) — most commonly returned by connection-ping
949
+ and adaptor-proxy responses.
950
+ message:
951
+ type: string
952
+ description: Human-readable description of the error.
953
+ field:
954
+ type: string
955
+ description: |-
956
+ Optional pointer to the document field that caused the error.
957
+ Used by structural validation errors (`missing_required_field`,
958
+ `invalid_ref`) to indicate which field is at fault
959
+ (e.g. `_id`, `type`, `http.baseURI`).
960
+ source:
961
+ type: string
962
+ description: |-
963
+ Optional origin layer for the error — e.g. `application` when
964
+ the error came from the remote system the adaptor called,
965
+ `connector` when the adaptor itself rejected the request.
966
+ required:
967
+ - message
968
+ required:
969
+ - errors
970
+ FileServerRequest:
971
+ type: object
972
+ description: |-
973
+ Body of `PUT /v1/mft/fileserver`. `enabled` must be an explicit boolean — an
974
+ absent or non-boolean value is rejected (422 `FILESERVER_ENABLED_REQUIRED`)
975
+ rather than read as a disable, because a disable ends every open partner
976
+ session.
977
+ required:
978
+ - enabled
979
+ properties:
980
+ enabled:
981
+ type: boolean
982
+ description: |-
983
+ When true, enables the server (creating it on the first call). When false,
984
+ disables it: the identifier and all accounts are kept, new logins are refused,
985
+ and open sessions end.
986
+ examples:
987
+ - true
988
+ identifier:
989
+ type: string
990
+ minLength: 3
991
+ maxLength: 30
992
+ pattern: ^[a-z0-9](?:[a-z0-9-]{1,28}[a-z0-9])$
993
+ description: |-
994
+ Required on the `PUT` that first enables the server; permanent afterwards.
995
+ Lowercased on save and unique across the region (409
996
+ `FILESERVER_IDENTIFIER_TAKEN` when another environment holds it). On later
997
+ calls omit it or echo the current value — any other value answers 422
998
+ `FILESERVER_IDENTIFIER_IMMUTABLE`, even on a disable.
999
+ examples:
1000
+ - acme-logistics
1001
+ x-celigo-ai-guidance:
1002
+ - |-
1003
+ Always send enabled as a JSON boolean: {} and {"enabled": "true"} both fail with 422
1004
+ FILESERVER_ENABLED_REQUIRED, and a non-JSON body fails with 400
1005
+ FILESERVER_JSON_BODY_REQUIRED. Never send a new identifier for an existing server —
1006
+ it is rejected with 422 FILESERVER_IDENTIFIER_IMMUTABLE even when enabled is unchanged.
1007
+ FileServerAccount:
1008
+ type: object
1009
+ description: |-
1010
+ A partner login on the environment's file server. The partner authenticates as
1011
+ `login` with the password set through `POST /v1/mft/fileserver/accounts/{_id}/password`
1012
+ (never returned — `passwordSet` only says whether one exists) and sees the
1013
+ Celigo Storage folder `_homeFolderId` as the root of the session. Disabling the
1014
+ account, deleting it, changing its password, or moving its home folder ends any
1015
+ session it has open.
1016
+ required:
1017
+ - _id
1018
+ - username
1019
+ - login
1020
+ - _homeFolderId
1021
+ - enabled
1022
+ - passwordSet
1023
+ - overCap
1024
+ - createdAt
1025
+ - lastModified
1026
+ properties:
1027
+ _id:
1028
+ type: string
1029
+ format: objectId
1030
+ readOnly: true
1031
+ description: Identifier of the account. Not derived from the username, so a rename keeps it.
1032
+ examples:
1033
+ - 6ab1f2737cf630a06d774d09
1034
+ username:
1035
+ type: string
1036
+ minLength: 3
1037
+ maxLength: 32
1038
+ pattern: ^[a-z0-9](?:[a-z0-9-]{1,30}[a-z0-9])$
1039
+ description: |-
1040
+ Partner's name on this server, unique per environment even while the account
1041
+ is disabled. Lowercased on save; a value outside the pattern is rejected with
1042
+ 422 `FILESERVER_USERNAME_INVALID` and a name another account already holds
1043
+ with 409 `FILESERVER_USERNAME_TAKEN`.
1044
+ examples:
1045
+ - northwind-edi
1046
+ login:
1047
+ type: string
1048
+ readOnly: true
1049
+ description: The exact SFTP username the partner types — `username`, `@`, then the server `identifier`.
1050
+ examples:
1051
+ - northwind-edi@acme-logistics
1052
+ _homeFolderId:
1053
+ type: string
1054
+ format: objectId
1055
+ x-celigo-refModel: storageitems
1056
+ description: |-
1057
+ Celigo Storage folder that is the root of every session for this account —
1058
+ the partner can reach nothing outside it. Must be an active folder in the same
1059
+ environment; otherwise the write answers 422 `FILESERVER_HOME_FOLDER_NOT_FOUND`
1060
+ or `FILESERVER_HOME_FOLDER_NOT_FOLDER`. Moving an account to another folder
1061
+ ends its open sessions.
1062
+ examples:
1063
+ - 6ab1f25daa3e7ed226ea3f25
1064
+ homeFolderPath:
1065
+ type:
1066
+ - string
1067
+ - 'null'
1068
+ readOnly: true
1069
+ description: |-
1070
+ Breadcrumb path of `_homeFolderId` from the storage root, for display. Null
1071
+ when the path could not be resolved for this response — the folder id is
1072
+ still authoritative.
1073
+ examples:
1074
+ - Partners/Northwind/Inbound
1075
+ enabled:
1076
+ type: boolean
1077
+ description: |-
1078
+ When true, the partner can log in. Disabling keeps the account and its password
1079
+ but refuses logins and ends open sessions; re-enabling counts against
1080
+ `limits.maxAccounts` and requires a password to be set (422
1081
+ `FILESERVER_LAST_CREDENTIAL` otherwise). New accounts start enabled.
1082
+ examples:
1083
+ - true
1084
+ passwordSet:
1085
+ type: boolean
1086
+ readOnly: true
1087
+ description: |-
1088
+ When true, the account has a password. The password itself is never returned by
1089
+ any route; change or clear it through `POST /v1/mft/fileserver/accounts/{_id}/password`.
1090
+ Clearing is allowed only while the account is disabled.
1091
+ examples:
1092
+ - true
1093
+ overCap:
1094
+ type: boolean
1095
+ readOnly: true
1096
+ description: |-
1097
+ When true, this enabled account ranks above the environment's `limits.maxAccounts`
1098
+ after the cap was lowered, so its logins are refused until enough other accounts
1099
+ are disabled or deleted. Computed on every read; always false while the
1100
+ environment is within its cap.
1101
+ examples:
1102
+ - false
1103
+ lastConnectedAt:
1104
+ type:
1105
+ - string
1106
+ - 'null'
1107
+ format: date-time
1108
+ readOnly: true
1109
+ description: Timestamp of the partner's most recent successful login. Null until the first one.
1110
+ examples:
1111
+ - '2026-09-22T14:35:31.646Z'
1112
+ createdAt:
1113
+ type: string
1114
+ format: date-time
1115
+ readOnly: true
1116
+ description: Timestamp when the account was created.
1117
+ examples:
1118
+ - '2026-09-22T03:13:56.060Z'
1119
+ lastModified:
1120
+ type: string
1121
+ format: date-time
1122
+ readOnly: true
1123
+ description: Timestamp of the last change to the account, including logins updating `lastConnectedAt`.
1124
+ examples:
1125
+ - '2026-09-22T14:35:31.648Z'
1126
+ FileServerAccountCreateRequest:
1127
+ type: object
1128
+ description: |-
1129
+ Body of `POST /v1/mft/fileserver/accounts`. The account is created enabled, so
1130
+ all three fields are needed for a partner to be able to log in. Checks run in
1131
+ this order and the first failure is returned: `username` shape, `password`
1132
+ presence, `_homeFolderId` presence, the enabled-account cap, then the folder's
1133
+ existence and type in this environment.
1134
+ required:
1135
+ - username
1136
+ - password
1137
+ - _homeFolderId
1138
+ properties:
1139
+ username:
1140
+ type: string
1141
+ minLength: 3
1142
+ maxLength: 32
1143
+ pattern: ^[a-z0-9](?:[a-z0-9-]{1,30}[a-z0-9])$
1144
+ description: |-
1145
+ Partner's name on this server; the SFTP login becomes `<username>@<identifier>`.
1146
+ Lowercased on save. Unique per environment, including against disabled accounts
1147
+ (409 `FILESERVER_USERNAME_TAKEN`).
1148
+ examples:
1149
+ - northwind-edi
1150
+ password:
1151
+ type: string
1152
+ format: password
1153
+ minLength: 12
1154
+ maxLength: 256
1155
+ description: |-
1156
+ Partner's password. Needs upper- and lower-case letters, a digit, and a symbol;
1157
+ anything weaker is rejected with 422 `FILESERVER_WEAK_PASSWORD` and the message
1158
+ names the rule broken. Never returned by any route — rotate or clear it later
1159
+ through `POST /v1/mft/fileserver/accounts/{_id}/password`.
1160
+ examples:
1161
+ - Nw-Inbound-2026!x
1162
+ _homeFolderId:
1163
+ type: string
1164
+ format: objectId
1165
+ x-celigo-refModel: storageitems
1166
+ description: |-
1167
+ Celigo Storage folder that becomes the root of the partner's sessions. Must be
1168
+ an active folder in this environment — create one with
1169
+ `POST /v1/storage/items` first.
1170
+ examples:
1171
+ - 6ab1f25daa3e7ed226ea3f25
1172
+ x-celigo-ai-guidance:
1173
+ - |-
1174
+ Send username, password and _homeFolderId together. A missing username answers 422
1175
+ FILESERVER_USERNAME_INVALID (same code as a malformed one), a missing password 422
1176
+ FILESERVER_LAST_CREDENTIAL, and a missing _homeFolderId 422
1177
+ FILESERVER_HOME_FOLDER_NOT_FOUND — each before anything is created.
1178
+ FileServerAccountUpdateRequest:
1179
+ type: object
1180
+ description: |-
1181
+ Body of `PUT /v1/mft/fileserver/accounts/{_id}`. Partial: only the fields sent
1182
+ change, and an empty object is a no-op that returns the current account. The
1183
+ password is not part of this body — use the dedicated password route.
1184
+ properties:
1185
+ username:
1186
+ type: string
1187
+ minLength: 3
1188
+ maxLength: 32
1189
+ pattern: ^[a-z0-9](?:[a-z0-9-]{1,30}[a-z0-9])$
1190
+ description: New name for the partner; `login` changes with it and `_id` does not. Same shape and uniqueness rules as on create.
1191
+ examples:
1192
+ - northwind-edi-2
1193
+ _homeFolderId:
1194
+ type: string
1195
+ format: objectId
1196
+ x-celigo-refModel: storageitems
1197
+ description: Move the account to another active folder in this environment. Ends the account's open sessions, which were rooted in the old folder.
1198
+ examples:
1199
+ - 6ab1f25daa3e7ed226ea3f25
1200
+ enabled:
1201
+ type: boolean
1202
+ description: |-
1203
+ Must be a JSON boolean when present (422 `FILESERVER_ENABLED_REQUIRED` for
1204
+ `"false"` or other non-booleans). False keeps the account but refuses logins
1205
+ and ends open sessions. True re-enables it — subject to `limits.maxAccounts`
1206
+ (403 `FILESERVER_MAX_ACCOUNTS_EXCEEDED`) and only if a password is set (422
1207
+ `FILESERVER_LAST_CREDENTIAL`).
1208
+ examples:
1209
+ - false
1210
+ FileServerAccountPasswordRequest:
1211
+ type: object
1212
+ description: |-
1213
+ Body of `POST /v1/mft/fileserver/accounts/{_id}/password`. Sets a new password or,
1214
+ with `null`, clears the current one. Either change ends the account's open
1215
+ sessions. Nothing is echoed back — the route answers 204.
1216
+ required:
1217
+ - password
1218
+ properties:
1219
+ password:
1220
+ type:
1221
+ - string
1222
+ - 'null'
1223
+ format: password
1224
+ description: |-
1225
+ The new password, meeting the same policy as on create (422
1226
+ `FILESERVER_WEAK_PASSWORD` otherwise), or `null` to remove the password —
1227
+ allowed only while the account is disabled, because an enabled account must
1228
+ keep a credential (422 `FILESERVER_LAST_CREDENTIAL`). Any other type answers
1229
+ 422 `FILESERVER_WEAK_PASSWORD` with the message "Password must be a string (or
1230
+ null to clear)."
1231
+ examples:
1232
+ - Nw-Inbound-2026!y
1233
+ responses:
1234
+ 401-unauthorized:
1235
+ description: |-
1236
+ Unauthorized. The request lacks a valid bearer token, or the provided token
1237
+ failed to authenticate.
1238
+
1239
+ Note: the 401 response is produced by the auth middleware **before** the
1240
+ request reaches the endpoint handler, so it does **not** follow the
1241
+ standard `{errors: [...]}` envelope. Instead the body is a bare
1242
+ `{message: string}` object with no `code`, no `errors` array. Callers
1243
+ handling 401s should key off the HTTP status and the `message` string,
1244
+ not try to destructure an `errors[]`.
1245
+ content:
1246
+ application/json:
1247
+ schema:
1248
+ type: object
1249
+ properties:
1250
+ message:
1251
+ type: string
1252
+ description: |-
1253
+ Human-readable description of the auth failure. Known values:
1254
+ - `"Unauthorized"` — no `Authorization` header on the request.
1255
+ - `"Bearer Authentication Failed"` — header present but token
1256
+ is invalid, revoked, or expired.
1257
+ required:
1258
+ - message
1259
+ examples:
1260
+ missing_token:
1261
+ summary: No Authorization header sent
1262
+ value:
1263
+ message: Unauthorized
1264
+ invalid_token:
1265
+ summary: Bearer token invalid or revoked
1266
+ value:
1267
+ message: Bearer Authentication Failed
1268
+ 403-full-access-required:
1269
+ description: The token is not a full-access API token (`FILESERVER_FULL_ACCESS_TOKEN_REQUIRED`), or the license lacks the add-on / the environment is a sandbox (`FILESERVER_NOT_ENTITLED`).
1270
+ content:
1271
+ application/json:
1272
+ schema:
1273
+ $ref: '#/components/schemas/Error'
1274
+ examples:
1275
+ scopedToken:
1276
+ value:
1277
+ errors:
1278
+ - code: FILESERVER_FULL_ACCESS_TOKEN_REQUIRED
1279
+ message: The file server management APIs require an API token with full access
1280
+ 404-account-not-found:
1281
+ description: No account with this id in the caller's environment, or the id is not a valid identifier (`FILESERVER_ACCOUNT_NOT_FOUND`).
1282
+ content:
1283
+ application/json:
1284
+ schema:
1285
+ $ref: '#/components/schemas/Error'
1286
+ examples:
1287
+ notFound:
1288
+ value:
1289
+ errors:
1290
+ - code: FILESERVER_ACCOUNT_NOT_FOUND
1291
+ message: File server account not found
1292
+ 422-server-not-enabled:
1293
+ description: The environment's server has never been enabled (`FILESERVER_NOT_ENABLED`); a disabled server is still manageable.
1294
+ content:
1295
+ application/json:
1296
+ schema:
1297
+ $ref: '#/components/schemas/Error'
1298
+ examples:
1299
+ notEnabled:
1300
+ value:
1301
+ errors:
1302
+ - code: FILESERVER_NOT_ENABLED
1303
+ message: Enable the file server before managing accounts
1304
+ parameters:
1305
+ AccountId:
1306
+ name: _id
1307
+ in: path
1308
+ required: true
1309
+ description: The file server account. A malformed value answers 404 like an unknown one.
1310
+ schema:
1311
+ type: string
1312
+ format: objectId
1313
+ examples:
1314
+ - 6ab1f2737cf630a06d774d09
1315
+ x-internal: false
1316
+ x-enable-proxy: true