@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.
- package/dist/audit.yml +5 -1
- package/dist/fileserver.yml +1316 -0
- package/dist/subscription.yml +30 -0
- package/package.json +1 -1
- package/schemas.json +1 -1
|
@@ -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
|