openapi.yaml 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471
  1. openapi: 3.0.3
  2. info:
  3. title: SFTPGo
  4. description: SFTPGo REST API
  5. version: 2.2.2
  6. servers:
  7. - url: /api/v1
  8. security:
  9. - BasicAuth: []
  10. paths:
  11. /healthz:
  12. get:
  13. security: []
  14. servers:
  15. - url : /
  16. tags:
  17. - healthcheck
  18. summary: health check
  19. description: Health endpoint to check if the application is still running and responding to requests
  20. responses:
  21. 200:
  22. description: successful operation
  23. content:
  24. text/plain:
  25. schema:
  26. type: string
  27. example: ok
  28. /version:
  29. get:
  30. tags:
  31. - maintenance
  32. summary: Get version details
  33. operationId: get_version
  34. responses:
  35. 200:
  36. description: successful operation
  37. content:
  38. application/json:
  39. schema:
  40. $ref : '#/components/schemas/VersionInfo'
  41. 401:
  42. $ref: '#/components/responses/Unauthorized'
  43. 403:
  44. $ref: '#/components/responses/Forbidden'
  45. 500:
  46. $ref: '#/components/responses/InternalServerError'
  47. default:
  48. $ref: '#/components/responses/DefaultResponse'
  49. /connection:
  50. get:
  51. tags:
  52. - connections
  53. summary: Get the active users and info about their uploads/downloads
  54. operationId: get_connections
  55. responses:
  56. 200:
  57. description: successful operation
  58. content:
  59. application/json:
  60. schema:
  61. type: array
  62. items:
  63. $ref : '#/components/schemas/ConnectionStatus'
  64. 401:
  65. $ref: '#/components/responses/Unauthorized'
  66. 403:
  67. $ref: '#/components/responses/Forbidden'
  68. 500:
  69. $ref: '#/components/responses/InternalServerError'
  70. default:
  71. $ref: '#/components/responses/DefaultResponse'
  72. /connection/{connectionID}:
  73. delete:
  74. tags:
  75. - connections
  76. summary: Terminate an active connection
  77. operationId: close_connection
  78. parameters:
  79. - name: connectionID
  80. in: path
  81. description: ID of the connection to close
  82. required: true
  83. schema:
  84. type: string
  85. responses:
  86. 200:
  87. description: successful operation
  88. content:
  89. application/json:
  90. schema:
  91. $ref: '#/components/schemas/ApiResponse'
  92. example:
  93. message: "Connection closed"
  94. 401:
  95. $ref: '#/components/responses/Unauthorized'
  96. 403:
  97. $ref: '#/components/responses/Forbidden'
  98. 404:
  99. $ref: '#/components/responses/NotFound'
  100. 500:
  101. $ref: '#/components/responses/InternalServerError'
  102. default:
  103. $ref: '#/components/responses/DefaultResponse'
  104. /quota_scan:
  105. get:
  106. tags:
  107. - quota
  108. summary: Get the active quota scans for users home directories
  109. operationId: get_quota_scans
  110. responses:
  111. 200:
  112. description: successful operation
  113. content:
  114. application/json:
  115. schema:
  116. type: array
  117. items:
  118. $ref : '#/components/schemas/QuotaScan'
  119. 401:
  120. $ref: '#/components/responses/Unauthorized'
  121. 403:
  122. $ref: '#/components/responses/Forbidden'
  123. 500:
  124. $ref: '#/components/responses/InternalServerError'
  125. default:
  126. $ref: '#/components/responses/DefaultResponse'
  127. post:
  128. tags:
  129. - quota
  130. summary: start a new user quota scan
  131. description: A quota scan update the number of files and their total size for the specified user
  132. operationId: start_quota_scan
  133. requestBody:
  134. required: true
  135. content:
  136. application/json:
  137. schema:
  138. $ref : '#/components/schemas/User'
  139. responses:
  140. 202:
  141. description: successful operation
  142. content:
  143. application/json:
  144. schema:
  145. $ref: '#/components/schemas/ApiResponse'
  146. example:
  147. message: "Scan started"
  148. 400:
  149. $ref: '#/components/responses/BadRequest'
  150. 401:
  151. $ref: '#/components/responses/Unauthorized'
  152. 403:
  153. $ref: '#/components/responses/Forbidden'
  154. 404:
  155. $ref: '#/components/responses/NotFound'
  156. 409:
  157. $ref: '#/components/responses/Conflict'
  158. 500:
  159. $ref: '#/components/responses/InternalServerError'
  160. default:
  161. $ref: '#/components/responses/DefaultResponse'
  162. /quota_update:
  163. put:
  164. tags:
  165. - quota
  166. summary: update the user used quota limits
  167. description: Set the current used quota limits for the given user
  168. operationId: quota_update
  169. parameters:
  170. - in: query
  171. name: mode
  172. required: false
  173. description: the update mode specifies if the given quota usage values should be added or replace the current ones
  174. schema:
  175. type: string
  176. enum: [add, reset]
  177. description: >
  178. Update type:
  179. * `add` - add the specified quota limits to the current used ones
  180. * `reset` - reset the values to the specified ones. This is the default
  181. example: reset
  182. requestBody:
  183. required: true
  184. description: The only user mandatory fields are username,used_quota_size and used_quota_files. Please note that if the quota fields are missing they will default to 0
  185. content:
  186. application/json:
  187. schema:
  188. $ref : '#/components/schemas/User'
  189. responses:
  190. 200:
  191. description: successful operation
  192. content:
  193. application/json:
  194. schema:
  195. $ref: '#/components/schemas/ApiResponse'
  196. example:
  197. message: "Quota updated"
  198. 400:
  199. $ref: '#/components/responses/BadRequest'
  200. 401:
  201. $ref: '#/components/responses/Unauthorized'
  202. 403:
  203. $ref: '#/components/responses/Forbidden'
  204. 404:
  205. $ref: '#/components/responses/NotFound'
  206. 409:
  207. $ref: '#/components/responses/Conflict'
  208. 500:
  209. $ref: '#/components/responses/InternalServerError'
  210. default:
  211. $ref: '#/components/responses/DefaultResponse'
  212. /folder_quota_update:
  213. put:
  214. tags:
  215. - quota
  216. summary: update the folder used quota limits
  217. description: Set the current used quota limits for the given folder
  218. operationId: folder_quota_update
  219. parameters:
  220. - in: query
  221. name: mode
  222. required: false
  223. description: the update mode specifies if the given quota usage values should be added or replace the current ones
  224. schema:
  225. type: string
  226. enum: [add, reset]
  227. description: >
  228. Update type:
  229. * `add` - add the specified quota limits to the current used ones
  230. * `reset` - reset the values to the specified ones. This is the default
  231. example: reset
  232. requestBody:
  233. required: true
  234. description: The only folder mandatory fields are mapped_path,used_quota_size and used_quota_files. Please note that if the used quota fields are missing they will default to 0
  235. content:
  236. application/json:
  237. schema:
  238. $ref : '#/components/schemas/BaseVirtualFolder'
  239. responses:
  240. 200:
  241. description: successful operation
  242. content:
  243. application/json:
  244. schema:
  245. $ref: '#/components/schemas/ApiResponse'
  246. example:
  247. message: "Quota updated"
  248. 400:
  249. $ref: '#/components/responses/BadRequest'
  250. 401:
  251. $ref: '#/components/responses/Unauthorized'
  252. 403:
  253. $ref: '#/components/responses/Forbidden'
  254. 404:
  255. $ref: '#/components/responses/NotFound'
  256. 409:
  257. $ref: '#/components/responses/Conflict'
  258. 500:
  259. $ref: '#/components/responses/InternalServerError'
  260. default:
  261. $ref: '#/components/responses/DefaultResponse'
  262. /folder_quota_scan:
  263. get:
  264. tags:
  265. - quota
  266. summary: Get the active quota scans for folders
  267. operationId: get_folders_quota_scans
  268. responses:
  269. 200:
  270. description: successful operation
  271. content:
  272. application/json:
  273. schema:
  274. type: array
  275. items:
  276. $ref : '#/components/schemas/FolderQuotaScan'
  277. 401:
  278. $ref: '#/components/responses/Unauthorized'
  279. 403:
  280. $ref: '#/components/responses/Forbidden'
  281. 500:
  282. $ref: '#/components/responses/InternalServerError'
  283. default:
  284. $ref: '#/components/responses/DefaultResponse'
  285. post:
  286. tags:
  287. - quota
  288. summary: start a new folder quota scan
  289. description: A quota scan update the number of files and their total size for the specified folder
  290. operationId: start_folder_quota_scan
  291. requestBody:
  292. required: true
  293. content:
  294. application/json:
  295. schema:
  296. $ref : '#/components/schemas/BaseVirtualFolder'
  297. responses:
  298. 202:
  299. description: successful operation
  300. content:
  301. application/json:
  302. schema:
  303. $ref: '#/components/schemas/ApiResponse'
  304. example:
  305. message: "Scan started"
  306. 400:
  307. $ref: '#/components/responses/BadRequest'
  308. 401:
  309. $ref: '#/components/responses/Unauthorized'
  310. 403:
  311. $ref: '#/components/responses/Forbidden'
  312. 404:
  313. $ref: '#/components/responses/NotFound'
  314. 409:
  315. $ref: '#/components/responses/Conflict'
  316. 500:
  317. $ref: '#/components/responses/InternalServerError'
  318. default:
  319. $ref: '#/components/responses/DefaultResponse'
  320. /folder:
  321. get:
  322. tags:
  323. - folders
  324. summary: Returns an array with one or more folders
  325. operationId: get_folders
  326. parameters:
  327. - in: query
  328. name: offset
  329. schema:
  330. type: integer
  331. minimum: 0
  332. default: 0
  333. required: false
  334. - in: query
  335. name: limit
  336. schema:
  337. type: integer
  338. minimum: 1
  339. maximum: 500
  340. default: 100
  341. required: false
  342. description: The maximum number of items to return. Max value is 500, default is 100
  343. - in: query
  344. name: order
  345. required: false
  346. description: Ordering folders by path. Default ASC
  347. schema:
  348. type: string
  349. enum:
  350. - ASC
  351. - DESC
  352. example: ASC
  353. - in: query
  354. name: folder_path
  355. required: false
  356. description: Filter by folder path, extact match case sensitive
  357. schema:
  358. type: string
  359. responses:
  360. 200:
  361. description: successful operation
  362. content:
  363. application/json:
  364. schema:
  365. type: array
  366. items:
  367. $ref : '#/components/schemas/BaseVirtualFolder'
  368. 400:
  369. $ref: '#/components/responses/BadRequest'
  370. 401:
  371. $ref: '#/components/responses/Unauthorized'
  372. 403:
  373. $ref: '#/components/responses/Forbidden'
  374. 500:
  375. $ref: '#/components/responses/InternalServerError'
  376. default:
  377. $ref: '#/components/responses/DefaultResponse'
  378. post:
  379. tags:
  380. - folders
  381. summary: Adds a new folder
  382. operationId: add_folder
  383. description: a new folder with the specified mapped_path will be added. To update the used quota parameters a quota scan is needed
  384. requestBody:
  385. required: true
  386. content:
  387. application/json:
  388. schema:
  389. $ref : '#/components/schemas/BaseVirtualFolder'
  390. responses:
  391. 200:
  392. description: successful operation
  393. content:
  394. application/json:
  395. schema:
  396. $ref : '#/components/schemas/BaseVirtualFolder'
  397. 400:
  398. $ref: '#/components/responses/BadRequest'
  399. 401:
  400. $ref: '#/components/responses/Unauthorized'
  401. 403:
  402. $ref: '#/components/responses/Forbidden'
  403. 500:
  404. $ref: '#/components/responses/InternalServerError'
  405. default:
  406. $ref: '#/components/responses/DefaultResponse'
  407. delete:
  408. tags:
  409. - folders
  410. summary: Delete an existing folder
  411. operationId: delete_folder
  412. parameters:
  413. - name: folder_path
  414. in: query
  415. description: path to the folder to delete
  416. required: true
  417. schema:
  418. type: string
  419. responses:
  420. 200:
  421. description: successful operation
  422. content:
  423. application/json:
  424. schema:
  425. $ref : '#/components/schemas/ApiResponse'
  426. example:
  427. message: "Folder deleted"
  428. 400:
  429. $ref: '#/components/responses/BadRequest'
  430. 401:
  431. $ref: '#/components/responses/Unauthorized'
  432. 403:
  433. $ref: '#/components/responses/Forbidden'
  434. 404:
  435. $ref: '#/components/responses/NotFound'
  436. 500:
  437. $ref: '#/components/responses/InternalServerError'
  438. default:
  439. $ref: '#/components/responses/DefaultResponse'
  440. /user:
  441. get:
  442. tags:
  443. - users
  444. summary: Returns an array with one or more users
  445. description: For security reasons hashed passwords are omitted in the response
  446. operationId: get_users
  447. parameters:
  448. - in: query
  449. name: offset
  450. schema:
  451. type: integer
  452. minimum: 0
  453. default: 0
  454. required: false
  455. - in: query
  456. name: limit
  457. schema:
  458. type: integer
  459. minimum: 1
  460. maximum: 500
  461. default: 100
  462. required: false
  463. description: The maximum number of items to return. Max value is 500, default is 100
  464. - in: query
  465. name: order
  466. required: false
  467. description: Ordering users by username. Default ASC
  468. schema:
  469. type: string
  470. enum:
  471. - ASC
  472. - DESC
  473. example: ASC
  474. - in: query
  475. name: username
  476. required: false
  477. description: Filter by username, extact match case sensitive
  478. schema:
  479. type: string
  480. responses:
  481. 200:
  482. description: successful operation
  483. content:
  484. application/json:
  485. schema:
  486. type: array
  487. items:
  488. $ref : '#/components/schemas/User'
  489. 400:
  490. $ref: '#/components/responses/BadRequest'
  491. 401:
  492. $ref: '#/components/responses/Unauthorized'
  493. 403:
  494. $ref: '#/components/responses/Forbidden'
  495. 500:
  496. $ref: '#/components/responses/InternalServerError'
  497. default:
  498. $ref: '#/components/responses/DefaultResponse'
  499. post:
  500. tags:
  501. - users
  502. summary: Adds a new user
  503. operationId: add_user
  504. requestBody:
  505. required: true
  506. content:
  507. application/json:
  508. schema:
  509. $ref : '#/components/schemas/User'
  510. responses:
  511. 200:
  512. description: successful operation
  513. content:
  514. application/json:
  515. schema:
  516. $ref : '#/components/schemas/User'
  517. 400:
  518. $ref: '#/components/responses/BadRequest'
  519. 401:
  520. $ref: '#/components/responses/Unauthorized'
  521. 403:
  522. $ref: '#/components/responses/Forbidden'
  523. 500:
  524. $ref: '#/components/responses/InternalServerError'
  525. default:
  526. $ref: '#/components/responses/DefaultResponse'
  527. /user/{userID}:
  528. get:
  529. tags:
  530. - users
  531. summary: Find user by ID
  532. description: For security reasons the hashed password is omitted in the response
  533. operationId: get_user_by_id
  534. parameters:
  535. - name: userID
  536. in: path
  537. description: ID of the user to retrieve
  538. required: true
  539. schema:
  540. type: integer
  541. format: int32
  542. responses:
  543. 200:
  544. description: successful operation
  545. content:
  546. application/json:
  547. schema:
  548. $ref : '#/components/schemas/User'
  549. 400:
  550. $ref: '#/components/responses/BadRequest'
  551. 401:
  552. $ref: '#/components/responses/Unauthorized'
  553. 403:
  554. $ref: '#/components/responses/Forbidden'
  555. 404:
  556. $ref: '#/components/responses/NotFound'
  557. 500:
  558. $ref: '#/components/responses/InternalServerError'
  559. default:
  560. $ref: '#/components/responses/DefaultResponse'
  561. put:
  562. tags:
  563. - users
  564. summary: Update an existing user
  565. operationId: update_user
  566. parameters:
  567. - name: userID
  568. in: path
  569. description: ID of the user to update
  570. required: true
  571. schema:
  572. type: integer
  573. format: int32
  574. - in: query
  575. name: disconnect
  576. schema:
  577. type: integer
  578. enum:
  579. - 0
  580. - 1
  581. description: >
  582. Disconnect:
  583. * `0` The user will not be disconnected and it will continue to use the old configuration until connected. This is the default
  584. * `1` The user will be disconnected after a successful update. It must login again and so it will be forced to use the new configuration
  585. requestBody:
  586. required: true
  587. content:
  588. application/json:
  589. schema:
  590. $ref : '#/components/schemas/User'
  591. responses:
  592. 200:
  593. description: successful operation
  594. content:
  595. application/json:
  596. schema:
  597. $ref : '#/components/schemas/ApiResponse'
  598. example:
  599. message: "User updated"
  600. 400:
  601. $ref: '#/components/responses/BadRequest'
  602. 401:
  603. $ref: '#/components/responses/Unauthorized'
  604. 403:
  605. $ref: '#/components/responses/Forbidden'
  606. 404:
  607. $ref: '#/components/responses/NotFound'
  608. 500:
  609. $ref: '#/components/responses/InternalServerError'
  610. default:
  611. $ref: '#/components/responses/DefaultResponse'
  612. delete:
  613. tags:
  614. - users
  615. summary: Delete an existing user
  616. operationId: delete_user
  617. parameters:
  618. - name: userID
  619. in: path
  620. description: ID of the user to delete
  621. required: true
  622. schema:
  623. type: integer
  624. format: int32
  625. responses:
  626. 200:
  627. description: successful operation
  628. content:
  629. application/json:
  630. schema:
  631. $ref : '#/components/schemas/ApiResponse'
  632. example:
  633. message: "User deleted"
  634. 400:
  635. $ref: '#/components/responses/BadRequest'
  636. 401:
  637. $ref: '#/components/responses/Unauthorized'
  638. 403:
  639. $ref: '#/components/responses/Forbidden'
  640. 404:
  641. $ref: '#/components/responses/NotFound'
  642. 500:
  643. $ref: '#/components/responses/InternalServerError'
  644. default:
  645. $ref: '#/components/responses/DefaultResponse'
  646. /status:
  647. get:
  648. tags:
  649. - maintenance
  650. summary: Retrieve the status of the active services
  651. operationId: get_status
  652. responses:
  653. 200:
  654. description: successful operation
  655. content:
  656. application/json:
  657. schema:
  658. $ref: '#/components/schemas/ServicesStatus'
  659. 400:
  660. $ref: '#/components/responses/BadRequest'
  661. 401:
  662. $ref: '#/components/responses/Unauthorized'
  663. 403:
  664. $ref: '#/components/responses/Forbidden'
  665. 500:
  666. $ref: '#/components/responses/InternalServerError'
  667. default:
  668. $ref: '#/components/responses/DefaultResponse'
  669. /dumpdata:
  670. get:
  671. tags:
  672. - maintenance
  673. summary: Backup SFTPGo data as data provider independent JSON
  674. description: The backup is saved to a local file to avoid to expose sensitive data over the network. The output of dumpdata can be used as input for loaddata
  675. operationId: dumpdata
  676. parameters:
  677. - in: query
  678. name: output_file
  679. schema:
  680. type: string
  681. required: true
  682. description: Path for the file to write the JSON serialized data to. This path is relative to the configured "backups_path". If this file already exists it will be overwritten
  683. - in: query
  684. name: indent
  685. schema:
  686. type: integer
  687. enum:
  688. - 0
  689. - 1
  690. description: >
  691. indent:
  692. * `0` no indentation. This is the default
  693. * `1` format the output JSON
  694. responses:
  695. 200:
  696. description: successful operation
  697. content:
  698. application/json:
  699. schema:
  700. $ref : '#/components/schemas/ApiResponse'
  701. example:
  702. message: "Data saved"
  703. 400:
  704. $ref: '#/components/responses/BadRequest'
  705. 401:
  706. $ref: '#/components/responses/Unauthorized'
  707. 403:
  708. $ref: '#/components/responses/Forbidden'
  709. 500:
  710. $ref: '#/components/responses/InternalServerError'
  711. default:
  712. $ref: '#/components/responses/DefaultResponse'
  713. /loaddata:
  714. get:
  715. tags:
  716. - maintenance
  717. summary: Restore SFTPGo data from a JSON backup
  718. description: Users and folders will be restored one by one and the restore is stopped if a user/folder cannot be added or updated, so it could happen a partial restore
  719. operationId: loaddata
  720. parameters:
  721. - in: query
  722. name: input_file
  723. schema:
  724. type: string
  725. required: true
  726. description: Path for the file to read the JSON serialized data from. This can be an absolute path or a path relative to the configured "backups_path". The max allowed file size is 10MB
  727. - in: query
  728. name: scan_quota
  729. schema:
  730. type: integer
  731. enum:
  732. - 0
  733. - 1
  734. - 2
  735. description: >
  736. Quota scan:
  737. * `0` no quota scan is done, the imported users will have used_quota_size and used_quota_files = 0 or the existing values if they already exists. This is the default
  738. * `1` scan quota
  739. * `2` scan quota if the user has quota restrictions
  740. required: false
  741. - in: query
  742. name: mode
  743. schema:
  744. type: integer
  745. enum:
  746. - 0
  747. - 1
  748. - 2
  749. description: >
  750. Mode:
  751. * `0` New users are added, existing users are updated. This is the default
  752. * `1` New users are added, existing users are not modified
  753. * `2` New users are added, existing users are updated and, if connected, they are disconnected and so forced to use the new configuration
  754. responses:
  755. 200:
  756. description: successful operation
  757. content:
  758. application/json:
  759. schema:
  760. $ref : '#/components/schemas/ApiResponse'
  761. example:
  762. message: "Data restored"
  763. 400:
  764. $ref: '#/components/responses/BadRequest'
  765. 401:
  766. $ref: '#/components/responses/Unauthorized'
  767. 403:
  768. $ref: '#/components/responses/Forbidden'
  769. 500:
  770. $ref: '#/components/responses/InternalServerError'
  771. default:
  772. $ref: '#/components/responses/DefaultResponse'
  773. components:
  774. responses:
  775. BadRequest:
  776. description: Bad Request
  777. content:
  778. application/json:
  779. schema:
  780. $ref: '#/components/schemas/ApiResponse'
  781. Unauthorized:
  782. description: Unauthorized
  783. content:
  784. application/json:
  785. schema:
  786. $ref: '#/components/schemas/ApiResponse'
  787. Forbidden:
  788. description: Forbidden
  789. content:
  790. application/json:
  791. schema:
  792. $ref: '#/components/schemas/ApiResponse'
  793. NotFound:
  794. description: Not Found
  795. content:
  796. application/json:
  797. schema:
  798. $ref: '#/components/schemas/ApiResponse'
  799. Conflict:
  800. description: Conflict
  801. content:
  802. application/json:
  803. schema:
  804. $ref: '#/components/schemas/ApiResponse'
  805. InternalServerError:
  806. description: Internal Server Error
  807. content:
  808. application/json:
  809. schema:
  810. $ref: '#/components/schemas/ApiResponse'
  811. DefaultResponse:
  812. description: Unexpected Error
  813. content:
  814. application/json:
  815. schema:
  816. $ref: '#/components/schemas/ApiResponse'
  817. schemas:
  818. Permission:
  819. type: string
  820. enum:
  821. - '*'
  822. - list
  823. - download
  824. - upload
  825. - overwrite
  826. - delete
  827. - rename
  828. - create_dirs
  829. - create_symlinks
  830. - chmod
  831. - chown
  832. - chtimes
  833. description: >
  834. Permissions:
  835. * `*` - all permissions are granted
  836. * `list` - list items is allowed
  837. * `download` - download files is allowed
  838. * `upload` - upload files is allowed
  839. * `overwrite` - overwrite an existing file, while uploading, is allowed. upload permission is required to allow file overwrite
  840. * `delete` - delete files or directories is allowed
  841. * `rename` - rename files or directories is allowed
  842. * `create_dirs` - create directories is allowed
  843. * `create_symlinks` - create links is allowed
  844. * `chmod` changing file or directory permissions is allowed
  845. * `chown` changing file or directory owner and group is allowed
  846. * `chtimes` changing file or directory access and modification time is allowed
  847. DirPermissions:
  848. type: object
  849. additionalProperties:
  850. type: array
  851. items:
  852. $ref: '#/components/schemas/Permission'
  853. minItems: 1
  854. minProperties: 1
  855. description: hash map with directory as key and an array of permissions as value. Directories must be absolute paths, permissions for root directory ("/") are required
  856. LoginMethods:
  857. type: string
  858. enum:
  859. - 'publickey'
  860. - 'password'
  861. - 'keyboard-interactive'
  862. - 'publickey+password'
  863. - 'publickey+keyboard-interactive'
  864. description: >
  865. To enable multi-step authentication you have to allow only multi-step login methods. If password login method is denied or no password is set then FTP and WebDAV users cannot login
  866. SupportedProtocols:
  867. type: string
  868. enum:
  869. - 'SSH'
  870. - 'FTP'
  871. - 'DAV'
  872. PatternsFilter:
  873. type: object
  874. properties:
  875. path:
  876. type: string
  877. description: exposed virtual path, if no other specific filter is defined, the filter apply for sub directories too. For example if filters are defined for the paths "/" and "/sub" then the filters for "/" are applied for any file outside the "/sub" directory
  878. allowed_patterns:
  879. type: array
  880. items:
  881. type: string
  882. nullable: true
  883. description: list of, case insensitive, allowed shell like file patterns.
  884. example: [ "*.jpg", "a*b?.png" ]
  885. denied_patterns:
  886. type: array
  887. items:
  888. type: string
  889. nullable: true
  890. description: list of, case insensitive, denied shell like file patterns. Denied patterns are evaluated before the allowed ones
  891. example: [ "*.zip" ]
  892. ExtensionsFilter:
  893. type: object
  894. properties:
  895. path:
  896. type: string
  897. description: exposed virtual path, if no other specific filter is defined, the filter apply for sub directories too. For example if filters are defined for the paths "/" and "/sub" then the filters for "/" are applied for any file outside the "/sub" directory
  898. allowed_extensions:
  899. type: array
  900. items:
  901. type: string
  902. nullable: true
  903. description: list of, case insensitive, allowed files extension. Shell like expansion is not supported so you have to specify `.jpg` and not `*.jpg`
  904. example: [ ".jpg", ".png" ]
  905. denied_extensions:
  906. type: array
  907. items:
  908. type: string
  909. nullable: true
  910. description: list of, case insensitive, denied files extension. Denied file extensions are evaluated before the allowed ones
  911. example: [ ".zip" ]
  912. UserFilters:
  913. type: object
  914. properties:
  915. allowed_ip:
  916. type: array
  917. items:
  918. type: string
  919. nullable: true
  920. description: only clients connecting from these IP/Mask are allowed. IP/Mask must be in CIDR notation as defined in RFC 4632 and RFC 4291, for example "192.0.2.0/24" or "2001:db8::/32"
  921. example: [ "192.0.2.0/24", "2001:db8::/32" ]
  922. denied_ip:
  923. type: array
  924. items:
  925. type: string
  926. nullable: true
  927. description: clients connecting from these IP/Mask are not allowed. Denied rules are evaluated before allowed ones
  928. example: [ "172.16.0.0/16" ]
  929. denied_login_methods:
  930. type: array
  931. items:
  932. $ref: '#/components/schemas/LoginMethods'
  933. nullable: true
  934. description: if null or empty any available login method is allowed
  935. denied_protocols:
  936. type: array
  937. items:
  938. $ref: '#/components/schemas/SupportedProtocols'
  939. nullable: true
  940. description: if null or empty any available protocol is allowed
  941. file_patterns:
  942. type: array
  943. items:
  944. $ref: '#/components/schemas/PatternsFilter'
  945. nullable: true
  946. description: filters based on shell like file patterns. These restrictions do not apply to files listing for performance reasons, so a denied file cannot be downloaded/overwritten/renamed but it will still be in the list of files. Please note that these restrictions can be easily bypassed
  947. file_extensions:
  948. type: array
  949. items:
  950. $ref: '#/components/schemas/ExtensionsFilter'
  951. nullable: true
  952. description: filters based on shell like patterns. Deprecated, use file_patterns. These restrictions do not apply to files listing for performance reasons, so a denied file cannot be downloaded/overwritten/renamed but it will still be in the list of files. Please note that these restrictions can be easily bypassed
  953. max_upload_file_size:
  954. type: integer
  955. format: int64
  956. nullable: true
  957. description: maximum allowed size, as bytes, for a single file upload. The upload will be aborted if/when the size of the file being sent exceeds this limit. 0 means unlimited. This restriction does not apply for SSH system commands such as `git` and `rsync`
  958. description: Additional restrictions
  959. Secret:
  960. type: object
  961. properties:
  962. status:
  963. type: string
  964. enum:
  965. - Plain
  966. - AES-256-GCM
  967. - Secretbox
  968. - GCP
  969. - AWS
  970. - VaultTransit
  971. - Redacted
  972. description: Set to "Plain" to add or update an existing secret, set to "Redacted" to preserve the existing value
  973. payload:
  974. type: string
  975. key:
  976. type: string
  977. additional_data:
  978. type: string
  979. mode:
  980. type: integer
  981. description: 1 means encrypted using a master key
  982. S3Config:
  983. type: object
  984. properties:
  985. bucket:
  986. type: string
  987. minLength: 1
  988. region:
  989. type: string
  990. minLength: 1
  991. access_key:
  992. type: string
  993. access_secret:
  994. $ref: '#/components/schemas/Secret'
  995. endpoint:
  996. type: string
  997. description: optional endpoint
  998. storage_class:
  999. type: string
  1000. upload_part_size:
  1001. type: integer
  1002. description: the buffer size (in MB) to use for multipart uploads. The minimum allowed part size is 5MB, and if this value is set to zero, the default value (5MB) for the AWS SDK will be used. The minimum allowed value is 5.
  1003. upload_concurrency:
  1004. type: integer
  1005. description: the number of parts to upload in parallel. If this value is set to zero, the default value (2) will be used
  1006. key_prefix:
  1007. type: string
  1008. description: key_prefix is similar to a chroot directory for a local filesystem. If specified the user will only see contents that starts with this prefix and so you can restrict access to a specific virtual folder. The prefix, if not empty, must not start with "/" and must end with "/". If empty the whole bucket contents will be available
  1009. example: folder/subfolder/
  1010. required:
  1011. - bucket
  1012. - region
  1013. nullable: true
  1014. description: S3 Compatible Object Storage configuration details
  1015. GCSConfig:
  1016. type: object
  1017. properties:
  1018. bucket:
  1019. type: string
  1020. minLength: 1
  1021. credentials:
  1022. $ref: '#/components/schemas/Secret'
  1023. automatic_credentials:
  1024. type: integer
  1025. nullable: true
  1026. enum:
  1027. - 0
  1028. - 1
  1029. description: >
  1030. Automatic credentials:
  1031. * `0` - disabled, explicit credentials, using a JSON credentials file, must be provided. This is the default value if the field is null
  1032. * `1` - enabled, we try to use the Application Default Credentials (ADC) strategy to find your application's credentials
  1033. storage_class:
  1034. type: string
  1035. key_prefix:
  1036. type: string
  1037. description: key_prefix is similar to a chroot directory for a local filesystem. If specified the user will only see contents that starts with this prefix and so you can restrict access to a specific virtual folder. The prefix, if not empty, must not start with "/" and must end with "/". If empty the whole bucket contents will be available
  1038. example: folder/subfolder/
  1039. required:
  1040. - bucket
  1041. nullable: true
  1042. description: Google Cloud Storage configuration details. The "credentials" field must be populated only when adding/updating a user. It will be always omitted, since there are sensitive data, when you search/get users
  1043. AzureBlobFsConfig:
  1044. type: object
  1045. properties:
  1046. container:
  1047. type: string
  1048. account_name:
  1049. type: string
  1050. description: Storage Account Name, leave blank to use SAS URL
  1051. account_key:
  1052. $ref: '#/components/schemas/Secret'
  1053. sas_url:
  1054. type: string
  1055. description: Shared access signature URL, leave blank if using account/key
  1056. endpoint:
  1057. type: string
  1058. description: optional endpoint. Default is "blob.core.windows.net". If you use the emulator the endpoint must include the protocol, for example "http://127.0.0.1:10000"
  1059. upload_part_size:
  1060. type: integer
  1061. description: the buffer size (in MB) to use for multipart uploads. If this value is set to zero, the default value (4MB) will be used.
  1062. upload_concurrency:
  1063. type: integer
  1064. description: the number of parts to upload in parallel. If this value is set to zero, the default value (2) will be used
  1065. access_tier:
  1066. type: string
  1067. enum:
  1068. - ""
  1069. - "Archive"
  1070. - "Hot"
  1071. - "Cool"
  1072. key_prefix:
  1073. type: string
  1074. description: key_prefix is similar to a chroot directory for a local filesystem. If specified the user will only see contents that starts with this prefix and so you can restrict access to a specific virtual folder. The prefix, if not empty, must not start with "/" and must end with "/". If empty the whole container contents will be available
  1075. example: folder/subfolder/
  1076. use_emulator:
  1077. type: boolean
  1078. nullable: true
  1079. description: Azure Blob Storage configuration details
  1080. CryptFsConfig:
  1081. type: object
  1082. properties:
  1083. passphrase:
  1084. $ref: '#/components/schemas/Secret'
  1085. description: Crypt filesystem configuration details
  1086. SFTPFsConfig:
  1087. type: object
  1088. properties:
  1089. endpoint:
  1090. type: string
  1091. description: remote SFTP endpoint as host:port
  1092. username:
  1093. type: string
  1094. description: you can specify a password or private key or both. In the latter case the private key will be tried first.
  1095. password:
  1096. $ref: '#/components/schemas/Secret'
  1097. private_key:
  1098. $ref: '#/components/schemas/Secret'
  1099. fingerprints:
  1100. type: array
  1101. items:
  1102. type: string
  1103. description: SHA256 fingerprints to use for host key verification. If you don't provide any fingerprint the remote host key will not be verified, this is a security risk
  1104. prefix:
  1105. type: string
  1106. description: Specifying a prefix you can restrict all operations to a given path within the remote SFTP server.
  1107. FilesystemConfig:
  1108. type: object
  1109. properties:
  1110. provider:
  1111. type: integer
  1112. enum:
  1113. - 0
  1114. - 1
  1115. - 2
  1116. - 3
  1117. - 4
  1118. - 5
  1119. description: >
  1120. Providers:
  1121. * `0` - Local filesystem
  1122. * `1` - S3 Compatible Object Storage
  1123. * `2` - Google Cloud Storage
  1124. * `3` - Azure Blob Storage
  1125. * `4` - Local filesystem encrypted
  1126. * `5` - SFTP
  1127. s3config:
  1128. $ref: '#/components/schemas/S3Config'
  1129. gcsconfig:
  1130. $ref: '#/components/schemas/GCSConfig'
  1131. azblobconfig:
  1132. $ref: '#/components/schemas/AzureBlobFsConfig'
  1133. cryptconfig:
  1134. $ref: '#/components/schemas/CryptFsConfig'
  1135. sftpconfig:
  1136. $ref: '#/components/schemas/SFTPFsConfig'
  1137. description: Storage filesystem details
  1138. BaseVirtualFolder:
  1139. type: object
  1140. properties:
  1141. id:
  1142. type: integer
  1143. format: int32
  1144. minimum: 1
  1145. mapped_path:
  1146. type: string
  1147. description: absolute filesystem path to use as virtual folder. This field is unique
  1148. used_quota_size:
  1149. type: integer
  1150. format: int64
  1151. used_quota_files:
  1152. type: integer
  1153. format: int32
  1154. last_quota_update:
  1155. type: integer
  1156. format: int64
  1157. description: Last quota update as unix timestamp in milliseconds
  1158. users:
  1159. type: array
  1160. nullable: true
  1161. items:
  1162. type: string
  1163. description: list of usernames associated with this virtual folder
  1164. required:
  1165. - mapped_path
  1166. description: defines the path for the virtual folder and the used quota limits. The same folder can be shared among multiple users and each user can have different quota limits or a different virtual path.
  1167. VirtualFolder:
  1168. allOf:
  1169. - $ref: '#/components/schemas/BaseVirtualFolder'
  1170. - type: object
  1171. properties:
  1172. virtual_path:
  1173. type: string
  1174. quota_size:
  1175. type: integer
  1176. format: int64
  1177. description: Quota as size in bytes. 0 menas unlimited, -1 means included in user quota. Please note that quota is updated if files are added/removed via SFTPGo otherwise a quota scan or a manual quota update is needed
  1178. quota_files:
  1179. type: integer
  1180. format: int32
  1181. description: Quota as number of files. 0 menas unlimited, , -1 means included in user quota. Please note that quota is updated if files are added/removed via SFTPGo otherwise a quota scan or a manual quota update is needed
  1182. required:
  1183. - virtual_path
  1184. description: A virtual folder is a mapping between a SFTPGo virtual path and a filesystem path outside the user home directory. The specified paths must be absolute and the virtual path cannot be "/", it must be a sub directory. The parent directory for the specified virtual path must exist. SFTPGo will try to automatically create any missing parent directory for the configured virtual folders at user login.
  1185. User:
  1186. type: object
  1187. properties:
  1188. id:
  1189. type: integer
  1190. format: int32
  1191. minimum: 1
  1192. status:
  1193. type: integer
  1194. enum:
  1195. - 0
  1196. - 1
  1197. description: >
  1198. status:
  1199. * `0` user is disabled, login is not allowed
  1200. * `1` user is enabled
  1201. username:
  1202. type: string
  1203. description: username is unique
  1204. expiration_date:
  1205. type: integer
  1206. format: int64
  1207. description: expiration date as unix timestamp in milliseconds. An expired account cannot login. 0 means no expiration
  1208. password:
  1209. type: string
  1210. nullable: true
  1211. description: password or public key/SSH user certificate are mandatory. If the password has no known hashing algo prefix it will be stored using argon2id. You can send a password hashed as bcrypt or pbkdf2 and it will be stored as is. For security reasons this field is omitted when you search/get users
  1212. public_keys:
  1213. type: array
  1214. items:
  1215. type: string
  1216. nullable: true
  1217. description: a password or at least one public key/SSH user certificate are mandatory.
  1218. home_dir:
  1219. type: string
  1220. description: path to the user home directory. The user cannot upload or download files outside this directory. SFTPGo tries to automatically create this folder if missing. Must be an absolute path
  1221. virtual_folders:
  1222. type: array
  1223. items:
  1224. $ref: '#/components/schemas/VirtualFolder'
  1225. nullable: true
  1226. description: mapping between virtual SFTPGo paths and filesystem paths outside the user home directory. Supported for local filesystem only. If one or more of the specified folders are not inside the dataprovider they will be automatically created. You have to create the folder on the filesystem yourself
  1227. uid:
  1228. type: integer
  1229. format: int32
  1230. minimum: 0
  1231. maximum: 65535
  1232. description: if you run SFTPGo as root user, the created files and directories will be assigned to this uid. 0 means no change, the owner will be the user that runs SFTPGo. Ignored on windows
  1233. gid:
  1234. type: integer
  1235. format: int32
  1236. minimum: 0
  1237. maximum: 65535
  1238. description: if you run SFTPGo as root user, the created files and directories will be assigned to this gid. 0 means no change, the group will be the one of the user that runs SFTPGo. Ignored on windows
  1239. max_sessions:
  1240. type: integer
  1241. format: int32
  1242. description: Limit the sessions that a user can open. 0 means unlimited
  1243. quota_size:
  1244. type: integer
  1245. format: int64
  1246. description: Quota as size in bytes. 0 menas unlimited. Please note that quota is updated if files are added/removed via SFTPGo otherwise a quota scan or a manual quota update is needed
  1247. quota_files:
  1248. type: integer
  1249. format: int32
  1250. description: Quota as number of files. 0 menas unlimited. Please note that quota is updated if files are added/removed via SFTPGo otherwise a quota scan or a manual quota update is needed
  1251. permissions:
  1252. type: object
  1253. items:
  1254. $ref: '#/components/schemas/DirPermissions'
  1255. minItems: 1
  1256. example: {"/":["*"],"/somedir":["list","download"]}
  1257. used_quota_size:
  1258. type: integer
  1259. format: int64
  1260. used_quota_files:
  1261. type: integer
  1262. format: int32
  1263. last_quota_update:
  1264. type: integer
  1265. format: int64
  1266. description: Last quota update as unix timestamp in milliseconds
  1267. upload_bandwidth:
  1268. type: integer
  1269. format: int32
  1270. description: Maximum upload bandwidth as KB/s, 0 means unlimited
  1271. download_bandwidth:
  1272. type: integer
  1273. format: int32
  1274. description: Maximum download bandwidth as KB/s, 0 means unlimited
  1275. last_login:
  1276. type: integer
  1277. format: int64
  1278. description: Last user login as unix timestamp in milliseconds. It is saved at most once every 10 minutes
  1279. filters:
  1280. $ref: '#/components/schemas/UserFilters'
  1281. filesystem:
  1282. $ref: '#/components/schemas/FilesystemConfig'
  1283. additional_info:
  1284. type: string
  1285. description: Free form text field for external systems
  1286. Transfer:
  1287. type: object
  1288. properties:
  1289. operation_type:
  1290. type: string
  1291. enum:
  1292. - upload
  1293. - download
  1294. path:
  1295. type: string
  1296. description: file path for the upload/download
  1297. start_time:
  1298. type: integer
  1299. format: int64
  1300. description: start time as unix timestamp in milliseconds
  1301. size:
  1302. type: integer
  1303. format: int64
  1304. description: bytes transferred
  1305. ConnectionStatus:
  1306. type: object
  1307. properties:
  1308. username:
  1309. type: string
  1310. description: connected username
  1311. connection_id:
  1312. type: string
  1313. description: unique connection identifier
  1314. client_version:
  1315. type: string
  1316. nullable: true
  1317. description: client version
  1318. remote_address:
  1319. type: string
  1320. description: Remote address for the connected client
  1321. connection_time:
  1322. type: integer
  1323. format: int64
  1324. description: connection time as unix timestamp in milliseconds
  1325. command:
  1326. type: string
  1327. nullable: true
  1328. description: SSH command or WebDAV method
  1329. last_activity:
  1330. type: integer
  1331. format: int64
  1332. description: last client activity as unix timestamp in milliseconds
  1333. protocol:
  1334. type: string
  1335. enum:
  1336. - SFTP
  1337. - SCP
  1338. - SSH
  1339. - FTP
  1340. - DAV
  1341. active_transfers:
  1342. type: array
  1343. nullable: true
  1344. items:
  1345. $ref : '#/components/schemas/Transfer'
  1346. QuotaScan:
  1347. type: object
  1348. properties:
  1349. username:
  1350. type: string
  1351. description: username with an active scan
  1352. start_time:
  1353. type: integer
  1354. format: int64
  1355. description: scan start time as unix timestamp in milliseconds
  1356. FolderQuotaScan:
  1357. type: object
  1358. properties:
  1359. mapped_path:
  1360. type: string
  1361. description: path with an active scan
  1362. start_time:
  1363. type: integer
  1364. format: int64
  1365. description: scan start time as unix timestamp in milliseconds
  1366. SSHHostKey:
  1367. type: object
  1368. properties:
  1369. path:
  1370. type: string
  1371. fingerprint:
  1372. type: string
  1373. BaseServiceStatus:
  1374. type: object
  1375. properties:
  1376. is_active:
  1377. type: boolean
  1378. address:
  1379. type: string
  1380. description: TCP address the server listen on in the form "host:port"
  1381. SSHServiceStatus:
  1382. allOf:
  1383. - $ref: '#/components/schemas/BaseServiceStatus'
  1384. - type: object
  1385. properties:
  1386. host_keys:
  1387. type: array
  1388. items:
  1389. $ref: '#/components/schemas/SSHHostKey'
  1390. ssh_commands:
  1391. type: string
  1392. description: accepted SSH commands comma separated
  1393. FTPPassivePortRange:
  1394. type: object
  1395. properties:
  1396. start:
  1397. type: integer
  1398. end:
  1399. type: integer
  1400. FTPServiceStatus:
  1401. allOf:
  1402. - $ref: '#/components/schemas/BaseServiceStatus'
  1403. - type: object
  1404. properties:
  1405. passive_port_range:
  1406. $ref: '#/components/schemas/FTPPassivePortRange'
  1407. ftpes:
  1408. type: string
  1409. enum:
  1410. - Disabled
  1411. - Enabled
  1412. - Required
  1413. WebDAVServiceStatus:
  1414. allOf:
  1415. - $ref: '#/components/schemas/BaseServiceStatus'
  1416. - type: object
  1417. properties:
  1418. protocol:
  1419. type: string
  1420. enum:
  1421. - HTTP
  1422. - HTTPS
  1423. DataProviderStatus:
  1424. type: object
  1425. properties:
  1426. is_active:
  1427. type: boolean
  1428. driver:
  1429. type: string
  1430. error:
  1431. type: string
  1432. ServicesStatus:
  1433. type: object
  1434. properties:
  1435. ssh:
  1436. $ref: '#/components/schemas/SSHServiceStatus'
  1437. ftp:
  1438. $ref: '#/components/schemas/FTPServiceStatus'
  1439. webdav:
  1440. $ref: '#/components/schemas/WebDAVServiceStatus'
  1441. data_provider:
  1442. $ref: '#/components/schemas/DataProviderStatus'
  1443. ApiResponse:
  1444. type: object
  1445. properties:
  1446. message:
  1447. type: string
  1448. description: message, can be empty
  1449. error:
  1450. type: string
  1451. nullable: true
  1452. description: error description if any
  1453. VersionInfo:
  1454. type: object
  1455. properties:
  1456. version:
  1457. type: string
  1458. build_date:
  1459. type: string
  1460. commit_hash:
  1461. type: string
  1462. features:
  1463. type: array
  1464. items:
  1465. type: string
  1466. description: Features for the current build. Available features are "portable", "bolt", "mysql", "sqlite", "pgsql", "s3", "gcs", "metrics". If a feature is available it has a "+" prefix, otherwise a "-" prefix
  1467. securitySchemes:
  1468. BasicAuth:
  1469. type: http
  1470. scheme: basic